常用正则表达式知识点解读及判读有效数字、手(2)

RegExp.prototype.myExecAll = function myExecAll() { var _this = this, str = arguments[0], ary = [], res = null; !_this.global ? _this = eval(_this.toString() + "g") : null; res = _this.exec(str); while (res) { ary[ary.length] = res[0]; res = _this.exec(str); } return ary; }; var ary = reg.myExecAll(str); console.log(ary); console.log(reg.lastIndex);//->0 var res = reg.exec(str); console.log(res); console.log(reg.lastIndex);//->11 res = reg.exec(str); console.log(res); console.log(reg.lastIndex);//->21 res = reg.exec(str); console.log(res);//->null

3、match:捕获字符串中存在一个叫做match的方法也可以实现捕获,而且只要我们取消了正则的懒惰性,执行一次match方法就可以捕获到所有内容了

var str = "zhufeng2015peixun2016"; var reg = /\d+/g; console.log(str.match(reg));

疑问:那我们都用match来替换exec多好啊?

4、正则的分组捕获

每一次捕获的时候,不仅仅可以把大正则匹配的内容捕获到,而且还可以把每一个小分组(子正则)匹配的内容单独的捕获到

var str = "zhufeng[2015]peixun[2016]"; var reg = /\[(\d)(\d+)\]/g; var res = reg.exec(str); console.log(res); ["[2015]", "2", "015", index: 7, input: "zhufeng[2015]peixun[2016]"]

第一项是大正则捕获的内容 res[0]
第二项是第一个分组捕获的内容 res[1]
第三项是第二个分组捕获的内容 rex[2]
。。。。。

分组的只匹配不捕获:我们如果执行把分组内容进行匹配但是不进行捕获的话,只需要在分组的前面加上?:即可

var str = "zhufeng[2015]peixun[2016]"; var reg = /\[(?:\d)(\d+)\]/g; var res = reg.exec(str); console.log(res); ["[2015]", "015"...]

数组中的第一项是大正则捕获的内容 res[0]
      数组中的第二项是第二个分组捕获的内容 res[1]
      第一个分组添加了?:,所以只匹配不捕获

5、exec和match的区别

match只能捕获大正则匹配的内容,对于分组捕获中,是无法获取分组匹配的内容的,所以如果捕获的时候不需要捕获分组的内容,我们直接用match更方便,如果需要捕获分组的内容,我们只能使用exec来一个个捕获

var str = "zhufeng[2015]peixun[2016]"; var reg = /\[(\d+)\]/g; //console.log(str.match(reg));//->["[2015]", "[2016]"] var ary = []; var res = reg.exec(str); while (res) { //ary.push(res[1]); ary.push(RegExp.$1);//RegExp.$1获取当前正则第一个分组捕获的内容,(可能在部分IE浏览器下捕获不到值) res = reg.exec(str); } console.log(ary);

6、正则的贪婪性:在每一次的捕获的时候,总是按照正则匹配的最长结果捕获

var str = "zhufeng2015peixun2016"; var reg = /\d+/g; console.log(reg.myExecAll(str));//-->["2015","2016"] var str = "zhufeng2015peixun2016"; var reg = /\d+?/g; console.log(reg.myExecAll(str));//-->["2", "0", "1", "5", "2", "0", "1", "6"]

7、分组引用

\2代表出现和第二个分组一模一样的内容

\1代表出现和第一个分组一模一样的内容

var reg=https://www.jb51.net/^(\w)(\w)\2\1$/; "woow"、"1221"...

8、字符串方法---->replace:把一个字符串中的某个字符替换成新的内容

1)在不使用正则的情况下

执行一次replace只能替换字符串中的一个,需要替换多个同样需要执行多次

var str = "zhufeng2015 zhufeng2016"; "zhufeng" -> "珠峰" str = str.replace("zhufeng", "珠峰").replace("zhufeng", "珠峰");

有些时候即使执行多次,也实现不了替换

"zhufeng" -> "zhufengpeixun" str = str.replace("zhufeng", "zhufengpeixun").replace("zhufeng", "zhufengpeixun");

[第一个参数可以是一个正则] 把所有和正则匹配的内容进行替换(但是和捕获一样默认是懒惰的,只有加上全局修饰符g才可以)

var str = "zhufeng2015 zhufeng2016"; str = str.replace(/zhufeng/g, "zhufengpeixun"); console.log(str);

1)执行和执行次数问题

其实和exec捕获的原理是一模一样的

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjpdsd.html