免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: namejm
打印 上一主题 下一主题

这个sed代码为什么无法正确匹配第一个字符 [复制链接]

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
11 [报告]
发表于 2012-03-28 22:17 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
12 [报告]
发表于 2012-03-29 09:52 |只看该作者
本帖最后由 namejm 于 2012-03-29 09:53 编辑

11楼这样一说之后,似乎明白了一点,原来sed的贪婪性是体现在先定位到匹配第一个表达式的字符串的最后一个,然后再逐次往前退继续匹配下一个表达式啊,我还以为是先定位到第一个匹配的字符之后,再朝后面最远的字符进行匹配呢。
不过对^匹配到行首似乎失效了还是感到有点困惑
按照我的理解,^首先匹配行首的位置,然后检查 . 匹配到什么,本来 . 可以匹配a、b、c的任意一个字符,但是,与^结合之后,应当只匹配到第一个字符a,再检查 + 匹配到什么地方,由于 + 可长可短,按照最多匹配的原则,应该匹配到行尾,所以 ^.+ 就可以匹配整行,^(.)+ 中的括号里的内容匹配到a……按照我这个理解,我就对代码的执行结果产生了困惑
当然,我这个理解是错误的,即使zooyo在11楼指出了 (.)+ 中括号的内容应当首先就匹配到最后一个内容,但是没有解释 ^ 在这里为什么没有生效,谁能继续解释一下吗?
正则没学好,所以waker让我上升到哲学的高度,我还没法跟帖,等我先学会了走路,再来和大家快跑吧。

论坛徽章:
0
13 [报告]
发表于 2012-03-29 10:02 |只看该作者
本帖最后由 hbmhalley 于 2012-03-29 10:05 编辑

回复 12# namejm


    (.) 的作用其实是配合 back reference 像(.)\1这样
    于是需要将匹配到的“.”存到编号为 1 的 () 里

    而 (.)+ 会匹配多次这个 (.) ,现版本的实现是每次匹配都将被匹配到的内容填充至 \1 ,不管之前是否被填充过,所以最后留下的是最后一次匹配到的“.”
    要是你觉得这样不合理 想自己写个“如果当前 \1 未被填充过则填充,否则保留不动”这种实现,谁也没意见。依赖可能被多次修改的 back reference 实在太不靠谱了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP