我看到这个正则表达式在一个 url 上执行:
$url = 'http://www.domain.com/';
preg_match('/(http)(.*?)\n/', $url, $matches);
我不确定问号“?”有什么用?在这个正则表达式中。根据正则表达式手册,“?” 是等效于 {0,1} 的元字符。那么,有“?”的意义何在?在 * 之后,因为 * 已经代表 {0,}
有人可以启发我。谢谢。
当它跟随另一个量词时,它具有不同的含义。
在这种情况下,它会改变前面量词的匹配行为。默认行为是贪婪的,并将其?
更改为“不贪婪”。
“贪婪”意味着尽可能匹配
“不贪婪”意味着匹配尽可能少
请参阅有关 regular-expression.info 的文章
例如:
a.+b
将匹配 aabxb 中的“aabxb ”
a.+?b
将仅匹配aabxb中的“aab”
请参阅Regexr 上的示例
你可能对我关于这个主题的博客文章感兴趣:你知道量词。真的吗?
关于你的正则表达式
preg_match('/(http)(.*?)\n/', $url, $matches);
我不认为这有什么不同。默认情况下.
匹配除换行符以外的任何字符(您可以通过s
在结束正则表达式分隔符后添加 a 来更改它),因此如果问号存在与否,它将只匹配到第一个\n
.
如果你通过使用改变行为preg_match('/(http)(.*?)\n/s', $url, $matches);
,它会有所作为。.*\n
将匹配到最后一个\n
,.*?\n
并将在第一个停止\n
。
在这种情况下,问号表示“吝啬”的匹配。一旦\n
遇到第一个,它将停止匹配,否则,它将吞噬干预\n
s 直到最后一个。
有关贪婪和吝啬匹配的更多信息,请访问 http://www.perl.com/doc/FMTEYEWTK/regexps.html