正则表达式4

这一节重点写正则中的贪婪和惰性的问题

贪婪和惰性


这里我们研究一下贪婪和惰性。请看下面的代码:

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] 已经没有了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容