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

  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=)(["'][\w\.\/:?%;&=-]*)(["']*?)(>)(.*?)(<\/a>)

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

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

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

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

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

你可能感兴趣的:(正则)