读《精通正则表达式》:标准量词是匹配优先的

正则字符:^.*([0-9]+)

待测字符:Copyright2003.

这个表达式的本意是捕获整个数字'2003',但结果并非如此。

为了满足"[0-9]+"的匹配,".*"必须交还一些字符。在这个例子中,释放的字符是"3."(即最后的"3"和点号),之后"3"能够由"[0-9]"匹配。

"[0-9]"由"+"量词修饰,所以现在还只做到了最小的匹配可能,现在它遇到了".",找不到其它可以匹配的字符。此时没有"必须"匹配的元素(已经满足了'[0-9]+'的匹配要求,后面没有更多的子表达式需要去匹配文本),所以".*"不会被迫交出0。

否则,"[0-9]+"应当心存感激,接受匹配优先元素的馈赠,但请记住"先来先服务"原则(在这里相当于:'Copyright200'已经被'.*'匹配,就不能再把数字'200'让'[0-9]+'去匹配了,因为'3'已经满足了'[0-9]+')。

匹配优先的结构只会在被迫的情况下交还字符(比如将'[0-9]+'改为'[0-9]{2,}',因为一个'3'不能满足,所以此时需要交还一个'0')。所以,最终$1(即第一个分组)的值是"3"。

相关推荐