正则表达式匹配疑问:为何两种.+模式均能匹配目标字符串?
正则匹配问题解析
目标字符串:
Marius Müller Osterhase
两种匹配成功的正则模式:
Marius .+OsterhaseMarius .+ Osterhase
为什么两种模式都能匹配?
贪婪模式的.+确实会优先匹配尽可能多的非换行字符,但它有个关键特性:当后续匹配失败时会自动回溯,逐步减少匹配的字符长度,直到找到能让整个正则匹配成功的位置。
对于第一种模式
Marius .+Osterhase:.+一开始会匹配从Müller到字符串末尾的所有内容(也就是Müller Osterhase),但此时后面没有剩余字符来匹配Osterhase,于是开始回溯,一点点“吐”出字符,直到Osterhase完整出现在剩余字符串开头。最终.+匹配的是Müller(包含末尾的空格),后面的Osterhase正好匹配,整个正则成功。对于第二种模式
Marius .+ Osterhase:.+先尝试匹配最多字符,直到遇到后面的空格和Osterhase匹配失败,然后回溯,直到.+匹配到Müller(不包含后面的空格),此时剩余的空格正好匹配正则里的空格,接着Osterhase也完美匹配,所以整个正则也成功。
你之前误以为只有中间两个空格的字符串才会匹配,是忽略了贪婪模式的回溯机制——它不会死磕“最多匹配”,而是会调整匹配长度来满足整个正则的匹配要求。
内容的提问来源于stack exchange,提问作者perlchamp
相关产品推荐
相关产品推荐

