我正试图阻止\g锚与字符串的开头匹配。我只想在最后一场正则表达式比赛结束时匹配。
给出以下文本:

Pig, Cow, Goat
fruit: apple, orange, peach, pear
vegetable: Carrot, Lettuce, Cellery

这种模式:
(fruit:|\G)([\w]+|[\, ])

我希望它只匹配“水果:”后面的单词,但我需要它单独捕获每个单词。如果我在这个模式的最后加一个+的话,它会匹配“水果:”后面的所有单词,但它只会捕获“梨”作为最后一个+的迭代。
这就是问题所在。此模式有效,但它也匹配“猪、牛和羊”,因为\g将匹配最后一个匹配的结尾或整个字符串的开头。如何防止它匹配整个字符串的开头?
我在php中使用pcre,我一直在使用rubular.com帮助我做快速测试。

最佳答案

在我看来,你是ReGEX并没有给你你想要的东西。你说你想要“水果:”后面的每个字。举个例子,我不认为你的第一次尝试真的给了你。尝试:

(?:fruit:\s*|\G,\s*)(\w+)

如果你全部匹配,那就应该给你没有空格或标点符号的单词。
这里有一个小结:
(?:-启动非捕获组
fruit:\s*-匹配良好的前导码
|
\G,\s*)-最后一个匹配位置,逗号和零个或多个空格
(\w+)捕获一个或多个单词字符
编辑:
为了防止在第一行匹配,如果第一行以逗号开头,后跟一个或多个逗号分隔的单词,只需在开始锚点后面的\G之前添加一个负零宽度的look:
(?:fruit:\s*|(?<!^)\G,\s*)(\w+)

07-24 22:03