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

Ian*_* Wu 1 java regex

为了".*?([a-m/]*).*"匹配字符串"fall/2005",我认为".*"将匹配任何字符0次或更多次.但是,由于存在?以下内容.*,因此仅匹配0或1次重​​复.所以我认为.*?会匹配,'f'但我错了.

我的逻辑有什么问题?

Jer*_*rry 8

在?这里充当"调节剂",如果我可以把它这样,使.*匹配尽可能少的匹配(称为"懒惰"),直到模式下一场比赛.

在fall/2005,第一个.*?将匹配在第一场比赛([a-m/]*),这是之前f.因此,.*?匹配0个字符以便([a-m/]*)匹配fall/,因为([a-m/]*)不再匹配,模式的下一部分.*匹配字符串中的左边,意思是2005.

相比之下.*([a-m/]*).*,您将.*首先尽可能地匹配(意味着整个字符串)并尝试返回以使其他术语匹配.除了问题是其他量词也能够匹配0个字符,所以.*单独匹配整个字符串(称为'贪婪').


也许一个不同的例子会有帮助.

.*ab
Run Code Online (Sandbox Code Playgroud)

在:

aaababaaabab
Run Code Online (Sandbox Code Playgroud)

在这里,.*将匹配尽可能多的字符,然后尝试匹配ab.因此,.*将匹配aaababaaab,其余将匹配ab.

.*?ab
Run Code Online (Sandbox Code Playgroud)

在:

aaababaaabab
Run Code Online (Sandbox Code Playgroud)

在这里,.*?将尽可能少地匹配ab,直到它在该正则表达式中匹配.第一次出现在ab这里:

aaababaaabab
  ^^
Run Code Online (Sandbox Code Playgroud)

所以,.*?匹配aa时ab会匹配ab.

  • 最后,有人正确地解释了这一点.其他答案听起来像`.*?`总是只匹配空字符串.介绍一个反例来证明什么时候`.*?`实际上会匹配某些东西,甚至当它有用时(即`z01234z56789z`,试图只得到前两个`z之间的东西)? (2认同)