php - 使一个或零个正则表达式运算符贪婪

标签 php regex greedy regex-greedy non-greedy

我有两个句子作为输入。比方说:

<span>I love my red car.</span>
<span>I love my car.</span>

现在我想匹配 span-tags 内的每个文本部分,如果有颜色的话。

如果我使用以下正则表达式:

/<span>(.*?)(?P<color>red)(.*?)<\/span>/ms

只匹配颜色线。所以我想让我们使用 ?-operator(代表 1 或 0)。

/<span>(.*?)(?P<color>red)?(.*?)<\/span>/ms

现在两行/句子都将匹配。遗憾的是颜色不再匹配。

问题是为什么?通过使用 ”。*?”在颜色部分之前,我认为我已经使正则表达式成为非贪婪的,这样颜色部分就会匹配,如果它存在的话。但正如所说,它不会...

最佳答案

第一个(.*?)将在 > 之间匹配和 I由于它是惰性的,它会立即测试正则表达式的下一部分:(?P<color>red)?但是没有 red在这一点上,所以 0 ? 的选项'activates' 正则表达式继续到下一部分,即 (.*?) .它将再次匹配 > 之间的部分和 I由于它是惰性的,它会检查正则表达式的下一部分:<\/span> (我把它当作一个整体)。

所以第二个(.*?)将一直匹配到那里。

确实,您的 results[1]将为空,results[color] 也将为空(我不记得你是否必须引用 color 或不)和 results[3]将包含 I love my red car. .

嗯,一种解决方法是像 NickC 在他的回答中提到的那样使用 OR。您可能会使用的另一种方法是使用否定前瞻来检查每个字符:

<span>((?:(?!\bred\b).)*(?<colour>\bred\b)?.*)<\/span>

regex101 demo

作为旁注,我建议使用边界一词,这样您就不会匹配 reduce 之类的东西。或 jarred .

关于php - 使一个或零个正则表达式运算符贪婪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866041/

相关文章:

php - 是什么导致我的 PHP SQL 查询出现此错误?

java - 无效的转义序列\d

algorithm - 在 O(nlog(range of bounds)) 时间内优化列表中的最大值

PHP 引发 SQL 语法错误

PHP,如何从数组中回显特定对象数据?

php - 将用户重定向到 php 中的同一页面问题

python - 需要 python 正则表达式来处理子字符串

php - 基本正则表达式帮助

algorithm - 相互重叠的事件子集

algorithm - 如果成本与使用每个数字相关联,则找出最大数量