2

可能重复:
正则表达式中的懒惰和贪婪是什么意思?

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

谢谢。

编辑:就我而言,我想检查一个 URL。之间有什么区别

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

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

?

4

4 回答 4

21

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

.*?是不贪婪的,这意味着如果满足下一个,它将继续到您的正则表达式的下一个分隔符。即使它本身仍然适用,它也会继续到下一个分隔符。

例子:

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

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

于 2012-08-30T13:09:19.643 回答
6

如果(.*)正则表达式中没有任何内容,那么绝对没有区别。但是,如果有以下任何内容,那么就会有所不同:

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

/(.*) went/  => "[I went to the shops and then I] went"
/(.*?) went/ => "[I] went"
于 2012-08-30T13:10:41.377 回答
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/非常适合尝试正则表达式

于 2012-08-30T13:29:04.567 回答
2

正如您已经知道不贪婪的行为是,我不会再解释了。

这取决于之后发生的(.*?)事情 - 这就是不贪婪的行为。

有趣的是,这意味着表单中的正则表达式/(.*?)/没有多大意义——因为如果你匹配所有的东西,你怎么能偷懒呢?

如果您尝试在例如Regexr中创建这个正则表达式,它甚至不会编译,因为它是无稽之谈。

只有当你把一些东西放在组后面时,你的正则表达式才会有意义。我不确定是否所有正则引擎都与 Regexr 在这里做同样的事情并拒绝接受该正则表达式。

所以,如果你想匹配任何东西直到某个字符,你必须把那个特定的字符放在的 ungreedy-anything-group 之后。这样,该特定字符之前的所有内容都会匹配。

得出结论;如果在组之后没有任何东西,它没有任何区别。

于 2012-08-30T13:13:03.193 回答