到底是什么。*?在正则表达式? “。*?([上午/]*)。*”

时间:2013-10-04 04:55:32

标签: java regex

对于匹配字符串".*?([a-m/]*).*"的{​​{1}},我认为"fall/2005"将匹配任何字符0次或更多次。但是,由于".*"之后有?,因此只匹配0或1次重​​复。所以我认为.*会匹配.*?,但我错了。

我的逻辑有什么问题?

4 个答案:

答案 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
  ^^

因此,.*?匹配aaab匹配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)