用正则表达式提取`<key> = <value>`对,点组(。+?)不与可选空格(\ s)合作</value> </key>

时间:2013-10-25 10:27:40

标签: regex pcre

我有这个字符串:

metadata=1.2 name=stone:supershare UUID=eff4e7bc:47aea5cf:0f0560f0:2de38475

我希望从中提取键值和值对:<key>=<value>

/(\w+)=(.+?)\s/g

正如预期的那样,这不会返回UUID对,因为没有后跟空格:

[
    "metadata=1.2 ",
    "name=stone:supershare "
],
[
    "metadata",
    "name"
],
[
    "1.2",
    "stone:supershare"
]

现在,显然,我们应该使\s查找可选:

/(\w+)=(.+?)\s?/g

尽管如此,这完全可以解除value中的第一个符号:

[
    "metadata=1",
    "name=s",
    "UUID=e"
],
[
    "metadata",
    "name",
    "UUID"
],
[
    "1",
    "s",
    "e"
]

我有点迷茫,我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

@acfrancis解释是正确的,另一方面你可以尝试以下方法:

/(\w+)=([^\s]+)/g

这与原始表达式中使用<key>的{​​{1}}相匹配,但随后使用(\w+)匹配该值,该([^\s]+)消耗一个或多个不是空格的字符。

Regex101 Demo

答案 1 :(得分:2)

由于\s不是必需的,因此前一部分(.+?)可以自由匹配由于?而尝试执行的一个字符。你可以:

  • (.+?)更改为(.+)但如果您的值可以包含空格或
  • ,则可能会导致其他问题
  • \s?更改为(?:\s|$)