【问题标题】:php regex: lookbehind and lookahead and greediness problemphp regex:lookbehind 和lookahead 以及贪婪问题
【发布时间】:2009-11-13 21:07:23
【问题描述】:

这应该很简单,但我是个菜鸟,我一辈子都想不通。我正在尝试使用正则表达式来匹配特殊打开/关闭标签内的文本:[p2][/p2]

所以在本文中:

apple [p2]banana[/p2] grape [p2]lemon[/p2]

它应该匹配“香蕉”和“柠檬”。到目前为止我处理的正则表达式是:

(?<=\[p2\]).+(?=\[\/p2\])

但这太贪心了。它匹配以香蕉中的“b”开头并以柠檬中的“n”结尾,匹配 banana[/p2] 葡萄 [p2]lemon。如何搭配香蕉和柠檬?

【问题讨论】:

  • 当然,我一发布这个我想我终于想通了:(?

标签: php regex greedy


【解决方案1】:

应该这样做:

(?<=\[p2\]).+?(?=\[\/p2\])

我添加了问号以使量词不贪婪。

【讨论】:

  • 或者,您可以指定 U 修饰符以指示模式中的所有量词都应视为非贪婪的,例如preg_match('/(?&lt;=\[p2\]).+(?=\[\/p2\])/U', .... 注意大写 U 字符会自动将+ 符号转换为非贪婪符号,而尾随?(贪婪运算符)将导致它表现出您所描述的行为.值得知道。见:us2.php.net/manual/en/reference.pcre.pattern.modifiers.php
  • @Dereleased:我不太明白。究竟有什么区别?不过,感谢您的评论。
  • /U 在这种情况下是多余的,因为只有一个量词。但无论如何我都会避免使用/U;它使您的正则表达式的可移植性降低(很少有正则表达式支持它)并且可读性降低。人们期望量词是贪婪的,并且必须有意识地努力超越这种期望。当您查看量词旁边的? 时,这样做会容易得多。
【解决方案2】:

除了使用正则表达式修饰符,您可以使用标准的 perl 样式匹配修饰符并添加一个 ?在 + 或 * 之后告诉该特定部分是非贪婪的。上面提到过,但特异性会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多