正则表达式中的问号

时间:2012-11-05 07:45:37

标签: php regex

我在网址上看到了这个正则表达式:

$url = 'http://www.domain.com/';
preg_match('/(http)(.*?)\n/', $url, $matches);

我不确定问号的用途是什么?“在这个正则表达式中。根据正则表达式手册,“?”是一个等同于{0,1}的元字符。然后,有什么意义的“?”在*之后*已经代表{0,}

有人可以赐教。感谢。

2 个答案:

答案 0 :(得分:6)

当它跟随另一个量词时,它有不同的含义。

在这种情况下,它会更改前一个量词的匹配行为。默认行为是贪婪的,?将其更改为“ungreedy”。

  • “贪婪”意味着尽可能匹配

  • “Ungreedy”表示尽可能少的匹配

请参阅article on regular-expression.info

例如:

a.+b将匹配 aabxb 中的“aabxb”

a.+?b只匹配 aabxb 中的“aab”

请参阅示例here on Regexr

您可能对我关于此主题的博文感兴趣:You do know Quantifiers. Really?

关于你的正则表达式

preg_match('/(http)(.*?)\n/', $url, $matches);

我认为这不会有所作为。 .默认情况下匹配除换行符之外的任何内容(您可以通过在结束正则表达式分隔符后添加s来更改此值),因此如果问号是否存在,它将仅匹配到第一个\n

如果您使用preg_match('/(http)(.*?)\n/s', $url, $matches);更改行为,则会产生影响。 .*\n将匹配到最后\n.*?\n将停在第一个\n

答案 1 :(得分:1)

在这种情况下,问号意味着“吝啬”的匹配。一旦遇到第一个\n,它就会停止匹配,否则,它会吞噬干预\n直到最后一个。

更多关于http://www.perl.com/doc/FMTEYEWTK/regexps.html

的贪婪和吝啬的匹配