可能重复:
正则表达式中的懒惰和贪婪是什么意思?
我知道在正则表达式中 *、+ 或 ? 之后的问号 意味着不贪心,但如果我想匹配任何字符,使用 (.*) 或 (.*?) 有什么区别?
谢谢。
编辑:就我而言,我想检查一个 URL。之间有什么区别
http://site\.net/(.*?)\.html
和
http://site\.net/(.*)\.html
?
可能重复:
正则表达式中的懒惰和贪婪是什么意思?
我知道在正则表达式中 *、+ 或 ? 之后的问号 意味着不贪心,但如果我想匹配任何字符,使用 (.*) 或 (.*?) 有什么区别?
谢谢。
编辑:就我而言,我想检查一个 URL。之间有什么区别
http://site\.net/(.*?)\.html
和
http://site\.net/(.*)\.html
?
.*
是贪婪的,这意味着它将忽略正则表达式的下一个分隔符,直到它本身没有被满足,除非后面的正则表达式.*
反对目标字符串的结尾。
.*?
是不贪婪的,这意味着如果满足下一个,它将继续到您的正则表达式的下一个分隔符。即使它本身仍然适用,它也会继续到下一个分隔符。
例子:
/(.*) dog/
将匹配“我认为你的狗咬了我的狗”,第 1 组将是“我认为你的狗咬了我的”。
/(.*?) dog/
将匹配“我认为你的狗咬了我的狗”,第 1 组将是“我认为你的”。
如果(.*)
正则表达式中没有任何内容,那么绝对没有区别。但是,如果有以下任何内容,那么就会有所不同:
"I went to the shops and then I went home"
/(.*) went/ => "[I went to the shops and then I] went"
/(.*?) went/ => "[I] went"
假设你有这个网址:
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/非常适合尝试正则表达式
正如您已经知道不贪婪的行为是,我不会再解释了。
这取决于之后发生的(.*?)
事情 - 这就是不贪婪的行为。
有趣的是,这意味着表单中的正则表达式/(.*?)/
没有多大意义——因为如果你匹配所有的东西,你怎么能偷懒呢?
如果您尝试在例如Regexr中创建这个正则表达式,它甚至不会编译,因为它是无稽之谈。
只有当你把一些东西放在组后面时,你的正则表达式才会有意义。我不确定是否所有正则引擎都与 Regexr 在这里做同样的事情并拒绝接受该正则表达式。
所以,如果你想匹配任何东西直到某个字符,你必须把那个特定的字符放在你的 ungreedy-anything-group 之后。这样,该特定字符之前的所有内容都会匹配。
得出结论;如果在组之后没有任何东西,它没有任何区别。