美文网首页
正则表达式4

正则表达式4

作者: 程咸菜 | 来源:发表于2016-08-22 23:06 被阅读0次

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

贪婪和惰性


这里我们研究一下贪婪和惰性。请看下面的代码:
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] 已经没有了。

相关文章

  • 正则表达式系列-1

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 什么是正则表达式 正则表达式就是用事先定...

  • 正则表达式系列-2

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 限定符(重复) 你已经看过了前面的*,+...

  • 正则表达式系列-3

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 反义 有时需要查找 不属于某个能简单定义...

  • 正则表达式系列-4

    正则表达式系列-1正则表达式系列-2正则表达式系列-3正则表达式系列-4 贪婪与懒惰 贪婪匹配:匹配尽可能多的字符...

  • 正则表达式收集

    常用正则表达式大全 常用正则表达式大全!(例如:匹配中文、匹配html) 匹配中文字符的正则表达式:[u4e00-...

  • 正则表达式

    1、正则表达式语法 2、正则表达式次数相关符号 3、分之和分组 4、re模块中的函数

  • 正则表达式优化

    正则表达式优化——《精通正则表达式》总结 [TOC] 第4章:表达式的匹配原理 引擎 DFA (Determini...

  • JS库函数~正则表达式及表单、ip验证实例

    本文内容: 1.什么是正则表达式? 2.正则表达式限定符、选择匹配符、字符匹配符 3.常用的正则表达式 4.创建R...

  • JavaScript学习笔记8_正则表达式_1模式匹配

    正则表达式匹配规则传送门 1.用于匹配的String方法 String支持4种使用正则表达式的方法。search(...

  • 正则表达式

    1、创建正则表达式 2、test方法测试正则表达式 3、边界符 4、字符 5、量词符 6、简写字符集 7、repl...

网友评论

      本文标题:正则表达式4

      本文链接:https://www.haomeiwen.com/subject/sxmgsttx.html