我有两个句子作为输入。比方说:
<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>
作为旁注,我建议使用边界一词,这样您就不会匹配 reduce
之类的东西。或 jarred
.
关于php - 使一个或零个正则表达式运算符贪婪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18866041/