我需要从本质上由键和值组成的文本行中分离(分组(组件。
第一个完整的单词是关键字,后面跟着任意数量的空白,然后空白结束后的所有都是值,包括更多的空白,但理想情况下不包括尾部空白。
键也可以有前导空格。
此外,该值可能为null,在这种情况下,字符串仍应与密钥的单个捕获组匹配
示例
键:";键";
值:";我是一个有价值的人;
测试用例(下划线表示空格(:
key
key___
___key___
key___I_am_a_value
__key___I_am_a_value
__key______I_am_a_value_______
在所有这些情况下,我希望最终得到两个捕获组,每个捕获组都包含上面引号之间显示的键和值,当值不存在时,第二组为空
为了澄清,在这种情况下,我使用空白来指代空格和制表符,而不是换行符。
这看起来很接近,只是它仍然在值中包含尾随空格,我不知道如何删除它:
(?<key>w+)(?:[ t]*(?<value>.*))
作为强调这个问题的最后一个例子,使用上面和这个测试字符串(再次为'_'=''(:
____people_________john_jim_jen_josh____
我得到
key: "people"
value: "john jim jen josh "
当我想要:
key: "people"
value: "john jim jen josh"
您可以使用
(?<key>w+)(?!S)[^Srn]*(?<value>(?:S+(?:[^Srn]+S+)*)*)
解释
(?<key>w+)
组键,匹配1个以上单词字符(?!S)
否定前瞻,断言右侧的空白边界[^Srn]*
匹配不带换行符的可选空格(?<value>
组值(?:
非捕获组S+
匹配1+个非空白字符(?:[^Srn]+S+)*
(可选(重复1个以上空格,不带换行符,后跟1个以上非空白字符
)*
关闭非捕获组并可选地重复
)
关闭组值
Regex演示
这里的问题是.*
——它只匹配到行的末尾。类似于用于所有非空白的S+
,或者(?:[ t]*[^ t]+)*
以空白和非空白的批次进行。我认为你需要对像这样的尾随空白进行独占:
(?<key>w+)[ t]+(?<value>(?:[ t]*[^ t]+)*)