对于匹配字符串".*?([a-m/]*).*"
的{{1}},我认为"fall/2005"
将匹配任何字符0次或更多次。但是,由于".*"
之后有?
,因此只匹配0或1次重复。所以我认为.*
会匹配.*?
,但我错了。
我的逻辑有什么问题?
答案 0 :(得分:8)
?
此处充当'修饰符',如果我可以这样调用它并使.*
匹配最不可能的匹配(称为'懒惰')直到模式中的下一个匹配。 / p>
在fall/2005
中,第一个.*?
将匹配([a-m/]*)
中的第一个匹配,即f
之前的匹配。因此,.*?
匹配0个字符,因此([a-m/]*)
将匹配fall/
,并且由于([a-m/]*)
不再匹配,因此模式.*
的下一部分与剩余的匹配字符串,意思是2005
。
与.*([a-m/]*).*
相比,您首先要.*
匹配(意味着整个字符串)并尝试返回以使其他字词匹配。除了问题是其他量词也能够匹配0个字符,所以.*
单独匹配整个字符串(称为'贪婪')。
也许一个不同的例子会有所帮助。
.*ab
在:
aaababaaabab
在此处,.*
会匹配尽可能多的字符,然后尝试匹配ab
。因此,.*
将匹配aaababaaab
,剩余部分将与ab
匹配。
.*?ab
在:
aaababaaabab
此处,.*?
将尽可能少地匹配,直到它与该正则表达式中的ab
匹配为止。第一次出现ab
就在这里:
aaababaaabab
^^
因此,.*?
匹配aa
,ab
匹配ab
。
答案 1 :(得分:2)
在正则表达式中:
?:没有或一次发生,?是{0,1}
的缩写
* ? :?在量词使它成为一个不情愿的量词之后,它试图找到最小的匹配。
答案 2 :(得分:1)
假设你有一个像这样的字符串输入
this is stackoverflow
你使用正则表达式
.*
所以输出将是
this is stackoverflow
但是如果你使用正则表达式
.*?
你的出局将是
this
所以从上面的例子可以看出,如果你使用。*它会给你整个字符串。 如果你想在空间之前只想要第一个cherector,你应该使用。*?
如需更多实用知识,请查看http://regexpal.com/
答案 3 :(得分:1)
?
(问号)在这里被视为 lazy ,所谓的不是贪婪。
你的正则表达式:
.*? any character except newline \n (0 or more times)
(matching the least amount possible)
( group and capture to \1:
[a-m/]* any character of: 'a' to 'm', '/' (0 or more times)
(matching the most amount possible)
) end of \1
.* any character except newline \n (0 or more times)
(matching the most amount possible)