我知道在正则表达式中*,+或?之后的问号意味着不合适,但如果我想匹配任何字符,使用(。*)或(。*?)之间的区别是什么?
感谢。
编辑: 在我的情况下,我想检查一个URL。
之间有什么区别http://site\.net/(.*?)\.html
和
http://site\.net/(.*)\.html
答案 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 在小组之后没有什么东西。