为了".*?([a-m/]*).*"匹配字符串"fall/2005",我认为".*"将匹配任何字符0次或更多次.但是,由于存在?以下内容.*,因此仅匹配0或1次重复.所以我认为.*?会匹配,'f'但我错了.
我的逻辑有什么问题?
在?这里充当"调节剂",如果我可以把它这样,使.*匹配尽可能少的匹配(称为"懒惰"),直到模式下一场比赛.
在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.