在RegEx(PCRE)上一场比赛结束时继续

And*_*rew 3 php regex pcre

我试图阻止\ G锚点匹配字符串的开头.我只希望它在最后一次正则表达式匹配结束时匹配.

鉴于以下文字:

Pig, Cow, Goat
fruit: apple, orange, peach, pear
vegetable: Carrot, Lettuce, Cellery
Run Code Online (Sandbox Code Playgroud)

这种模式:

(fruit:|\G)([\w]+|[\, ])
Run Code Online (Sandbox Code Playgroud)

我希望它只匹配"fruit:"之后的单词,但我需要它来单独捕获每个单词.如果我只是在这个模式的最后添加一个+,它将匹配"fruit:"之后的所有单词,但它只会捕获"梨"作为最后一次+ st脚的迭代.

这是问题所在.这种模式有效,除了它还匹配"猪,牛和山羊",因为\ G将匹配最后一个匹配的结束或整个字符串的开头.如何防止它匹配整个字符串的开头?

我在PHP中使用PCRE,我一直在使用Rubular.com来帮助我进行快速测试.

Rob*_*rtB 6

在我看来,你是正则表达式并没有给你你想要的东西.你说你希望每个词都跟着"水果:".举个例子,我认为你的第一次尝试并没有真正给你这个.尝试:

(?:fruit:\s*|\G,\s*)(\w+)
Run Code Online (Sandbox Code Playgroud)

如果你匹配所有,那应该给你没有空格或标点符号的单词.

这是一个纲要:

  • (?: - 开始非捕获组
  • fruit:\s* - 良好比赛的序言
  • | - 要么
  • \G,\s*) - 最后一个匹配位置,一个逗号和零个或多个空格
  • (\w+) 捕获一个或多个单词字符

编辑:

为了防止你在第一行得到匹配的情况,如果第一行以逗号开头,后跟一个或多个逗号分隔的单词,只需在开始锚点之前添加一个负零宽度后视\G:

(?:fruit:\s*|(?<!^)\G,\s*)(\w+)
Run Code Online (Sandbox Code Playgroud)