正则表达式(.*?)惰性匹配终于搞懂了

  1. "."匹配任意除换行符“\n”外的字符,那如果你也想匹配换行符怎么办?(.|\n)不就可以了
  2. "*"表示匹配前一个字符0次或无限次
  3. +?或*?表示非贪婪匹配,即尽可能少的匹配,如*?重复匹配任意次,但尽可能少重复。重点其实就在这个少重复了,怎么个少重复法?就是在能完整的匹配到一个字符串的情况下*?要尽量少的匹配字符串。

举个上面3的例子
比如你的正则是a.+b,现在有个字符串adsabopbc,这种情况下这个正则表达式能匹配的就是adsabopb,因为中间的.+会保证在尽量能匹配成功的前提下尽量的多匹配字符。
但是如果你的正则是a.+?b,那么匹配的结果就是adsab了,因为他会保证在尽量能匹配的成功的情况下少的匹配字符。

怎么样,是不是以为你懂了,那我们再来看个例子,如果你说对了,你就真的懂了

需要进行匹配的串

<a href="/" id="re" onmouse="return c()"><a href="java:;" name="i">关闭</a><a class="tx" href="/">你好啊</a>

正则

<a.+?href=["'][\w\.\/:?%;&=-]*["']*?>.*?<\/a>

来想一想用这个正则去匹配上面的串会有什么结果

分析一下:
首先正则中的<a位置成功匹配了,然后原串中出现了空格,“.”能进行匹配,那原串中的href由谁来继续匹配呢?由“.”,还是由“.”后面的href,这就要回到我们上面的第三条了,“.”是要保证在能匹配成功的情况下更少的进行匹配。假如我们现在“.”不匹配了,看这个正则去匹配这个字符串能不能匹配成功。接下来就由正则中的href去继续匹配了,后面就不继续分析了,很明显我们继续按照正则匹配下去,这个字符串是不能匹配成功的。所以,这个正则要想成功匹配上面的串的话,这个“.”就要去匹配原串中的href以及继续往后匹配,这样才能成功的匹配到这个串。
上面这个正则是能完整匹配这个字符串的

来验证一下我们上面说的,我们把正则修改成下面这个形式

(<a)(.+?)(href=)(["'][\w\.\/:?%;&=-]*)(["']*?)(>)(.*?)(<\/a>)

我们来看每个匹配组分别给我们匹配到了什么,以此来验证。
可以看出第二个匹配组(.+?)是不是跟我上面说的一样。
不知道你现在有没有理解到这个完整匹配到的情况下尽量少匹配的含义了,少匹配的前提是要在他少匹配之后,这个正则能匹配成功。

我之前的想法是写一个能匹配所有a标签的正则,不写不知道,原来对正则的理解有误区。

匹配所有有href属性的a标签的正则

/<a[^>]+?href=["'][^>]*?["'][^>]*?>.*?<\/a>/g

可以思考一些为什么用“[^>]”来进行非贪婪匹配而不是“.”

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值