Regex将键/值与空白分隔符匹配,没有前导/尾随空白,AND值可以有空格



我需要从本质上由键和值组成的文本行中分离(分组(组件。

第一个完整的单词是关键字,后面跟着任意数量的空白,然后空白结束后的所有都是值,包括更多的空白,但理想情况下不包括尾部空白。

键也可以有前导空格。

此外,该值可能为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]+)*)

最新更新