正则字符:^.*([0-9]+)
待测字符:Copyright 2003.
这个表达式的本意是捕获整个数字'2003',但结果并非如此。
为了满足"[0-9]+"的匹配,".*"必须交还一些字符。在这个例子中,释放的字符是"3."(即最后的"3"和点号 ),之后"3"能够由"[0-9]"匹配。
"[0-9]"由"+"量词修饰,所以现在还只做到了最小的匹配可能,现在它遇到了".",找不到其它可以匹配的字符。此时没有"必须"匹配的元素(已经满足了'[0-9]+'的匹配要求,后面没有更多的子表达式需要去匹配文本 ),所以".*"不会被迫交出0。
否则,"[0-9]+"应当心存感激,接受匹配优先元素的馈赠,但请记住"先来先服务"原则(在这里相当于:'Copyright 200'已经被'.*'匹配,就不能再把数字'200'让'[0-9]+'去匹配了,因为'3'已经满足了 '[0-9]+ ')。
匹配优先的结构只会在被迫的情况下交还字符(比如将'[0-9]+'改为'[0-9]{2,}',因为一个'3'不能满足,所以此时需要交还一个'0' )。所以,最终$1(即第一个分组)的值是"3"。
待测字符:Copyright 2003.
这个表达式的本意是捕获整个数字'2003',但结果并非如此。
为了满足"[0-9]+"的匹配,".*"必须交还一些字符。在这个例子中,释放的字符是"3."(即最后的"3"和点号 ),之后"3"能够由"[0-9]"匹配。
"[0-9]"由"+"量词修饰,所以现在还只做到了最小的匹配可能,现在它遇到了".",找不到其它可以匹配的字符。此时没有"必须"匹配的元素(已经满足了'[0-9]+'的匹配要求,后面没有更多的子表达式需要去匹配文本 ),所以".*"不会被迫交出0。
否则,"[0-9]+"应当心存感激,接受匹配优先元素的馈赠,但请记住"先来先服务"原则(在这里相当于:'Copyright 200'已经被'.*'匹配,就不能再把数字'200'让'[0-9]+'去匹配了,因为'3'已经满足了 '[0-9]+ ')。
匹配优先的结构只会在被迫的情况下交还字符(比如将'[0-9]+'改为'[0-9]{2,}',因为一个'3'不能满足,所以此时需要交还一个'0' )。所以,最终$1(即第一个分组)的值是"3"。
正则表达式匹配解析
本文探讨了正则表达式中的特殊匹配行为,通过实例解释了如何正确理解'^.*([0-9]+)'这一表达式的工作原理。文章指出在尝试捕获数字序列时,由于懒惰匹配与贪婪匹配之间的冲突,实际捕获的结果可能与预期不符。
5316

被折叠的 条评论
为什么被折叠?



