php - 在 RegEx (PCRE) 中的上一场比赛结束时继续

标签 php regex pcre

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

给定以下文本:

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

这个模式:

(fruit:|\G)([\w]+|[\, ])

我希望它只匹配“fruit:”之后的单词,但我需要它单独捕获每个单词。如果我只是把 + 放在这个模式的最后,它会匹配“fruit:”之后的所有词,但它只会捕获“pear”,因为 + 的每次迭代都会踩到最后一个。

问题来了。这种模式有效,除了它还匹配“Pig, Cow and Goat”,因为\G 将匹配最后一个匹配项的结尾或整个字符串的开头。如何防止它匹配整个字符串的开头?

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

最佳答案

在我看来,您的正则表达式并未满足您的要求。你说你想要每个词都跟在“水果:”之后。鉴于你的例子,我认为你的第一次尝试并没有真正给你那个。尝试:

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

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

这是一个纲要:

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

编辑:

为防止在第一行获得匹配,如果第一行以逗号开头,后跟一个或多个逗号分隔的单词,只需在起始 anchor 上添加一个负的零宽度后视在 \G 之前:

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

关于php - 在 RegEx (PCRE) 中的上一场比赛结束时继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572697/

相关文章:

php - 使用 PHP 的 cURL,可以确定 cURL 将使用的 IP 地址吗?

java - 使用java正则表达式从xml中提取作者

php 替换多个 br 标签

php - Paypal Integration 持币

php - 使用 MySQLi 将行插入 MySQL 数据库

使用数据透视表具有多对多关系的 PHP Laravel 应用程序

Java正则表达式匹配两个相同的数字

c - 如何在 pcre2_substitute 中设置输出大小

Python 正则表达式 : Ignore Escaped Character

regex - 使用 PCRE 正则表达式从类似 CSV 的字符串中提取值,包括空字段