正则表达式(vim版)非贪婪匹配释疑

本以为自己虽然并没有特别精通正则表达式,但是基本的用法还是没有问题.但是最近遇到一个问题还是让我捉襟见肘,在此感谢大牛哥的指导.

首先我们大致了解一下正则表达式.

元字符:

.   任意字符

^   行首

$   行尾

+   一到多个紧跟在其前面的字符的个数

?   0到1个紧跟其前面的字符

*   0到多个紧跟其前面的字符

{}   紧跟其前面的字符的个数,可选方式有.{N}, {N,M}, {N,},分别表示出现N次,出现N到M次,出现N到多次.

OK,有了上面的这个简要说明,下面的问题就不难理解了.

情景复现,首先看一下源文件大致的布局:

<animals exp="bird">
  <animal fly="1" swim="1" name="3" />
  <animal fly="1" swim="1" name="3" cmdid=""/>
  <animal fly="1" swim="1" name="1" cmdid=""/>
</animals>
在这段代码中,我想要animal中找到不含cmdid的字段.显然这里面只有一行是满足要求的.

最初的正则表达式:

/<animal .*name=".\{-}"\s\/>
本以为这这个表达式可以,没想到结果却是这样的.

这个结果的确让人始料未及.我使用了是贪婪匹配.不应该仅仅匹配第二行才对嘛.

其实这里存在一个问题.正则表达式的原则是匹配.所有其它原则都是建立在这个基础上面的.所以我们可以看一下第三是否匹配.答案是匹配.且仅有这一种匹配情形.

既然只有一种匹配情形,就谈不上非贪婪了.所谓非贪婪,是建立在匹配的基础上面的.

明确了问题,我们想想该怎么解决这个问题呢.

/<animal.*name="[^"]\{-}" \/>
使用上面这段作为正则表达式进行匹配,就可以达到预期的目的.因为限定了""之间最短匹配的内容之中不能有"

这一次对于正则表达式的使用经历还是之前没有过的.完全不懂得怎么分析这个问题,不过好在得到了前辈的指导.不仅解决了这个问题.也理解了这个问题.希望这篇心得可以帮助到你.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值