0

我看到这个正则表达式在一个 url 上执行:

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

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

有人可以启发我。谢谢。

4

2 回答 2

6

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

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

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

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

请参阅有关 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

于 2012-11-05T07:48:59.760 回答
1

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

有关贪婪和吝啬匹配的更多信息,请访问 http://www.perl.com/doc/FMTEYEWTK/regexps.html

于 2012-11-05T07:47:28.913 回答