(。*)和(。*?)之间的差异

时间:2012-08-30 13:06:53

标签: php regex

  

可能重复:
  what does lazy and greedy means in regexp?

我知道在正则表达式中*,+或?之后的问号意味着不合适,但如果我想匹配任何字符,使用(。*)或(。*?)之间的区别是什么?

感谢。

编辑: 在我的情况下,我想检查一个URL。

之间有什么区别
http://site\.net/(.*?)\.html

http://site\.net/(.*)\.html

4 个答案:

答案 0 :(得分:19)

.*是贪婪的,这意味着它将忽略你的正则表达式的下一个分隔符,直到它本身未被满足,除非.*后面的正则表达式反对目标字符串的末尾。

.*?是不合适的,这意味着它将继续执行你的正则表达式的下一个分隔符,如果则完成下一个。它将继续进入下一个分隔符,即使它本身仍然适用。

示例:

/(.*) dog/将匹配“我认为你的狗咬我的狗”,第1组将是“我认为你的狗咬我的”。

/(.*?) dog/将匹配“我认为你的狗咬我的狗”,第1组将是“我认为你的”。

答案 1 :(得分:6)

如果正则表达式中的(.*)之后没有任何内容,那么绝对没有区别。但是,如果 后面有任何内容,那么就会有区别:

"I went to the shops and then I went home"

/(.*) went/  => "[I went to the shops and then I] went"
/(.*?) went/ => "[I] went"

答案 2 :(得分:3)

假设你有这个网址:

http://example.net/some/wierd/path.html?returnTo=somedoc.html

贪婪将与整条线相匹配:

http://example.net/some/wierd/path.html?returnTo=somedoc.html

而非贪婪的回报:

http://example.net/some/wierd/path.html

http://refiddle.com/非常适合尝试正则表达式

答案 3 :(得分:2)

正如你已经知道不合适的行为,我不会再解释。

这取决于(.*?) 后面的内容 - 这就是不合适的行为。

有趣的是,这意味着/(.*?)/形式的正则表达式没有多大意义 - 因为如果你无论如何都匹配,你怎么能变得懒惰呢?

如果您尝试在例如此处创建此正则表达式Regexr,它甚至不会编译,因为它是无意义的。

只有当你把一些东西放在小组后面时,你的正则表达才会有任何意义。我不确定所有的rege引擎是否和Regexr一样,并且拒绝接受正则表达式。

所以,如果你想匹配某个角色之前的任何东西,你必须在之后加上这个特定角色。这样,匹配特定字符之前的所有内容。

使其得出结论;它没有任何区别, IF 在小组之后没有什么东西。