惰性匹配(lazy)
它会匹配尽可能少的字符,它从第一个字符开始找起,一旦符合条件,立刻保存到匹配集合中,然后继续进行查找。所以说它是懒惰的。
还是这个例子:
nowamagic.net is a <b>good</b> website to <b>learn</b> IT <b>skills</c>.
<b>.*</b>
效果演示
本例代码
function reg_replace() { var test = document.getElementById("test"); aim = "<b>.*</b> "; var regex = new RegExp("("+aim+")","g"); test.innerHTML = test.innerHTML.replace(regex,"<span style='background-color:orange'>$1</span>"); }
这样匹配显然不是我们的初衷,它仅找到了一个匹配,而通常情况下,我们希望得到的是<b>good</b> 和 <b>learn</b> 两个匹配。
解决的办法,就是上面说到的惰性匹配,它的语法如下表所示:
贪婪匹配 | 惰性匹配 | 匹配描述 |
? | ?? | 匹配 0 个或 1 个 |
+ | +? | 匹配 1 个或多个 |
* | *? | 匹配 0 个或多个 |
{n} | {n}? | 匹配 n 个 |
{n,m} | {n,m}? | 匹配 n 个或 m 个 |
{n,} | {n,}? | 匹配 n 个或多个 |
对于本例,当我们再使用惰性匹配。
<b>.*?</b>
效果演示
惰性匹配的匹配过程
n // 不匹配,继续 no // 不匹配,继续 ... // 中间略 nowamagic.net is a < // 找到可能匹配的字符,继续 nowamagic.net is a <b // 找到可能匹配的字符,继续 ... // 中间略 //找到匹配,保存到结果集中,继续进行剩下的文本。 nowamagic.net is a <b>good</b> website to <b>learn</b> IT <b>skills</c>. w // 不匹配,继续 we // 不匹配,继续 website to < // 找到可能的匹配,继续 website to <b // 找到可能的匹配,继续 ... // 中间略 //找到匹配,保存到结果集中,继续进行剩下的文本。 website to <b>learn</b> I //不匹配,继续 IT //不匹配,继续 IT < // 找到可能的匹配,继续 IT <b // 找到可能的匹配,继续 ... // 中间略 IT <b>skills</c>. // 匹配失败,继续找 IT <b>skills</c>. // 不匹配,继续 // 字符串结束,匹配结束。一共找到了两个匹配<b>good</b>和<b>learn</b> IT <b>skills</c>.
我们回顾一下上面 “\d{1,3}” 匹配数字的例子,对于“1234”,当我们使用“\d{1,3}”时,进行的是贪婪匹配,它首先找到“123”(因为“1234”不符合),之后的“4”也符合,所以,找到的匹配是“123”和“4”。
当我们使用“\d{1,3}?”匹配上面的例子,对于“1234”,这次是惰性匹配。首先,发现“1”符合,将“1”保存到匹配集合中;随后,依次发现“2”、“3”、“4”符合,并依次保存到结果集中,最后,我们得到了四个匹配“1”、“2”、“3”、“4”。
延伸阅读
此文章所在专题列表如下:
- 什么是正则表达式?
- 正则入门:匹配固定的单个字符
- 正则入门:匹配任意的单个字符
- 正则入门:字符组的使用
- 正则入门:在字符组中使用字符区间
- 正则入门:反义字符组的使用
- 正则入门:匹配空字符
- 正则入门:匹配一个或多个字符
- 正则入门:匹配零个或多个字符
- 正则入门:匹配零个或一个字符串
- 正则入门:匹配固定数目的字符
- 正则入门:匹配区间内数目的字符
- 正则入门:贪婪匹配
- 正则入门:惰性匹配
- 正则入门:两个匹配模式
- 正则入门:匹配单词边界
- 正则入门:边界的定义与相对性
- 正则入门:匹配非单词边界
- 正则入门:匹配文本首和尾
- 正则入门:子模式
- 正则入门:“或”匹配
- 正则入门:后向引用文本替换
- 正则入门:非获取匹配
- 正则总结:JavaScript中的正则表达式
- 正则总结:正则表达式在js中的高级应用
本文地址:http://www.nowamagic.net/librarys/veda/detail/1038,欢迎访问原出处。
大家都在看