perl正则之贪婪与非贪婪匹配

回复 收藏
/fred.+barney/  会匹配到 fred and barney went bowling last night 字符串。它的匹配过程是这样的:

1. 首先匹配到了 fred ;

2. 然后.+ 则会匹配整个字符串,也就是说它一下子匹配到了字符串的末尾, .+因为是匹配换行符外的1个或多个任意字符,所以它很贪婪的把整个字符串都匹配了;

3. 现在轮到模式中的barney, 但它没有办法匹配了,因为已经到了字符串的末尾。此时 .+ 很不情愿的吐出最后一个字符,再去比对是否匹配barney,当然吐一个是不行的,所以它逐次的去吐出最后一个字符,直到匹配了barney。

这样看来,perl的正则很浪费时间呀,所以这里造出来一个非贪婪匹配: .+?
/fred.+?barney/   .+?  同样也是会匹配1个以上的任意字符,但是是越短越好,而不是一下子全部匹配。

非贪婪匹配还有类似的:  .*?  {n,m}? {m,}?  等
2012-12-19 17:36 举报
已邀请:

回复帖子,请先登录注册

退出全屏模式 全屏模式 回复
评分
可选评分理由: