我在网址上看到了这个正则表达式:
$url = 'http://www.domain.com/';
preg_match('/(http)(.*?)\n/', $url, $matches);
我不确定问号的用途是什么?“在这个正则表达式中。根据正则表达式手册,“?”是一个等同于{0,1}的元字符。然后,有什么意义的“?”在*之后*已经代表{0,}
有人可以赐教。感谢。
答案 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
直到最后一个。