这一节重点写正则中的贪婪和惰性的问题
贪婪和惰性
这里我们研究一下贪婪和惰性。请看下面的代码:
var pattern=/[a-z]/;
var str='abcdefg';
document.write(str.replace(pattern,'1'))
当我们加上全局以后看是什么结果:
可以看出全局的时候会有全部替换成了1。
当我们加上贪婪以后会是怎么样的变化:
var pattern=/[a-z]+/;
var str='abcdefg';
document.write(str.replace(pattern,'1'))
这时候所有的字母都没有了,只有一个1.贪婪就是把所有的字符替换成了一个1,一个1,一个1.说三遍。
如果使用惰性模式呢?? 我们看代码
var pattern=/[a-z]?/;
var str='abcdefg';
document.write(str.replace(pattern,'1'))
这时候只是替换了一个。
我们再看一个例子。代码如下
var pattern=/8(.*)8/;
var str='this is 8google8 and 8yahoo8 and 8baidu8';//我们想要打印出加粗的google别的不变。
document.write(str.replace(pattern,'<strong>$1</strong>'));
打印的如下图
看到并不是我们想要的结果,他把第一个 8 和最后一个 8 之间的所有的都加粗了。
是因为使用了贪婪,所以结果不是我们要求的,接下来使用惰性模式看看。
var pattern=/8(.*?)8/;//使用了惰性模式
var str='this is 8google8 and 8yahoo8 and 8baidu8';//我们想要打印出加粗的google别的不变。
document.write(str.replace(pattern,'<strong>$1</strong>'));
我们看看是什么情况。看下图
现在看到他已经加粗了,是我们目的要求的类型。如果我们想要把三个都替换掉,那么应该怎么做,我们给惰性模式加一个全局。
var pattern=/8(.*?)8/g;//使用了惰性模式加全局。
var str='this is 8google8 and 8yahoo8 and 8baidu8';//我们想要打印出加粗的google别的不变。
document.write(str.replace(pattern,'<strong>$1</strong>'));
除了惰性模式还有一种方法也可以做到就我们要求的只匹配第一个。具体看代码
var pattern=/8([^8]*)8/;//使用 ^ 屏蔽掉8
var str='this is 8google8 and 8yahoo8 and 8baidu8';//我们想要打印出加粗的google别的不变。
document.write(str.replace(pattern,'<strong>$1</strong>'));
如果想把三个都匹配,那么加入全局就好了。
var pattern=/8([^8]*)8/g;//加入了全局,屏蔽了包含8的匹配
var str='this is 8google8 and 8yahoo8 and 8baidu8';//我们想要打印出三个都加粗。
document.write(str.replace(pattern,'<strong>$1</strong>'));
这样就达到了我们的目的。
使用 exec 返回分组
返回整个字符串
var pattern=/^[a-z]+\s[0-9]{4}$/g;
var str='google 2016';
var A=pattern.exec(str);
document.write('A[0]='+A[0]+"<br/>"+"<br/>"+'A[1]='+A[1]);
可以看到返回的是数组。
使用分组
var pattern=/^([a-z]+)\s([0-9]{4})$/g;
var str='google 2016';
var A=pattern.exec(str);
document.write('A[0]='+A[0]+"<br/>"+"<br/>"+'A[1]='+A[1]+"
<br/>"+"<br/>"+'A[2]='+A[2]);
其中 A[0]代表是返回到匹配的整个数组。 A[1]代表返回到匹配的第一个分组的字符串。 A[2]代表返回匹配到的第二个分组的字符串。
捕获性分组和非捕获性分组
捕获性分组
var pattern =/(\d+)([a-z]+)\s([a-z]+)/;
var str="2016google abc";
var A=pattern.exec(str);
document.write('A[0]='+A[0]+"<br/>"+"<br/>"+'A[1]='+A[1]+"<br/>"+"<br/>"+'A[2]='+A[2]+"<br/>"+"<br/>"+'A[3]='+A[3]+"<br/>"+"<br/>"+'A[4]='+A[4]);
从下图可以看出是数组的长度是 4.
最后返回匹配的第五个数组是 undifined 。捕获性分组就是把所有匹配到的数组全部捕获返回。
非捕获性分组
var pattern =/(\d+)([a-z]+)\s(?:[a-z]+)/;
var str="2016google abc";
var A=pattern.exec(str);
document.write('A[0]='+A[0]+"<br/>"+"<br/>"+'A[1]='+A[1]+"<br/>"+"<br/>"+'A[2]='+A[2]+"<br/>"+"<br/>"+'A[3]='+A[3]+"<br/>"+"<br/>"+'A[4]='+A[4]);
非捕获性分组就是在不需要捕获匹配的分组中加入 ?: 从图可以看到 A[3] 已经没有了。