免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6672 | 回复: 16
打印 上一主题 下一主题

问个有关perl贪婪匹配的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-07 16:38 |只看该作者 |倒序浏览
以下测试代码:
my $sStr=' just a test can you find me ';
if ($sStr =~ /\s*([a-zA-Z]+)\s*/i) {
        print "matched [$1]\n";
}
my $sStr = 'abcdefgabcdefg';
if ($sStr =~ /abc(.+)g/i) {
        print "matched [$1]\n";
}

结果为
matched [just]
matched [defgabcdef]

按我对新版PERL的资料查询,默认应该是贪婪匹配,非贪婪使用?标示,但为什么第一个输出没有按贪婪原则尽可能匹配到结束呢?

论坛徽章:
1
申猴
日期:2014-04-18 16:29:14
2 [报告]
发表于 2010-09-07 16:48 |只看该作者
[a-zA-z]匹配不了‘ ’啊,所以只能到‘t’。
还有[a-zA-Z]+模式i,重复了吧

论坛徽章:
0
3 [报告]
发表于 2010-09-07 17:06 |只看该作者
$1表示匹配得到的第一个括号子模式。
与 /\s*([a-zA-Z]+)\s*/i 匹配的第一个模式就是' just ',找到了匹配就不再继续进行匹配,[a-zA-Z]匹配不到空格,()子模式匹配到了just。
同样/abc(.+)g/i模式匹配尽可能多的字符就是'abcdefgabcdefg',但是()匹配到的是中间的'defgabcdef'

论坛徽章:
0
4 [报告]
发表于 2010-09-08 09:04 |只看该作者
我只是奇怪为什么第一个不会匹配到" me "而是" just ",如果按楼上说的找到了一个就不再找,那还叫贪婪吗?

论坛徽章:
0
5 [报告]
发表于 2010-09-08 10:28 |只看该作者
楼主对匹配中贪婪的理解有偏差,贪婪特指匹配时的量词:+、*和{min,max}而言
贪婪指匹配时量词匹配的数量尽可能多
而并非指整个表达式能匹配的次数尽可能多
在\s*([a-zA-Z]+)\s*中,贪婪指[a-zA-Z]+要匹配尽可能多的连续的[a-zA-Z]
而不是指要表达式\s*([a-zA-Z]+)\s*要匹配尽可能多次
并且,它不会匹配到me不是因为贪婪的问题,而是因为正则表达式匹配时会从字符串最左开始匹配,当匹配成功时,就会退出
这里就是从' just a test can you find me '的最左边开始,当匹配了just以后,正则表达式匹配成功,退出,就不会再去匹配后面的me了

个人意见,仅供参考,呵呵

论坛徽章:
0
6 [报告]
发表于 2010-09-08 10:32 |只看该作者
回复 1# qiuf


    [a-zA-Z]+ , +好表示一个或者多个+前面的字符

论坛徽章:
0
7 [报告]
发表于 2010-09-08 10:44 |只看该作者
楼主··如果你改成


  1. my $sStr=' just a test can you find me ';
  2. if ($sStr =~ /\s*(.+)\s*/i) {
  3.         print "matched [$1]\n";
  4. }
复制代码
那就匹配了··楼主不能了解.+和[]+··前者才是一次吞了后面所有字符~~·而后者则不会~~

论坛徽章:
0
8 [报告]
发表于 2010-09-08 10:46 |只看该作者
我也觉得奇怪,按我的理解是第一个/s*要匹配到最后结尾,然后吐出来一个me中的e,然后匹配就结束了。请教知道的人

论坛徽章:
0
9 [报告]
发表于 2010-09-08 10:47 |只看该作者
我只是奇怪为什么第一个不会匹配到" me "而是" just ",如果按楼上说的找到了一个就不再找,那还叫贪婪吗?
qiuf 发表于 2010-09-08 09:04


[a-zA-Z]+ 只會盡可能吃掉它能吃掉的東西, 你的字符串中間有空格, 這個是它吃不掉的, 所以就到不了"me".
雖然貪婪匹配會盡可能吃掉它能匹配上的字符, 但是正則表達式以成功匹配整個表達式為大前提, 爲了滿足這個前提, 貪婪匹配的部份可能會吐出匹配到的字符, 結果就不是能吃到的最長的部份了.

论坛徽章:
0
10 [报告]
发表于 2010-09-08 10:54 |只看该作者
我打算今晚去看了一下精通正则表达式,感觉和perl的搜索机制有关系
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP