/fred.+barney/ 会匹配到 fred and barney went bowling last night 字符串。它的匹配过程是这样的:
1. 首先匹配到了 fred ;
2. 然后.+ 则会匹配整个字符串,也就是说它一下子匹配到了字符串的末尾, .+因为是匹配换行符外的1个或多个任意字符,所以它很贪婪的把整个字符串都匹配了;
3. 现在轮到模式中的barney, 但它没有办法匹配了,因为已经到了字符串的末尾。此时 .+ 很不情愿的吐出最后一个字符,再去比对是否匹配barney,当然吐一个是不行的,所以它逐次的去吐出最后一个字符,直到匹配了barney。
这样看来,perl的正则很浪费时间呀,所以这里造出来一个非贪婪匹配: .+?
/fred.+?barney/ .+? 同样也是会匹配1个以上的任意字符,但是是越短越好,而不是一下子全部匹配。
非贪婪匹配还有类似的: .*? {n,m}? {m,}? 等
1. 首先匹配到了 fred ;
2. 然后.+ 则会匹配整个字符串,也就是说它一下子匹配到了字符串的末尾, .+因为是匹配换行符外的1个或多个任意字符,所以它很贪婪的把整个字符串都匹配了;
3. 现在轮到模式中的barney, 但它没有办法匹配了,因为已经到了字符串的末尾。此时 .+ 很不情愿的吐出最后一个字符,再去比对是否匹配barney,当然吐一个是不行的,所以它逐次的去吐出最后一个字符,直到匹配了barney。
这样看来,perl的正则很浪费时间呀,所以这里造出来一个非贪婪匹配: .+?
/fred.+?barney/ .+? 同样也是会匹配1个以上的任意字符,但是是越短越好,而不是一下子全部匹配。
非贪婪匹配还有类似的: .*? {n,m}? {m,}? 等
编辑回复