1、正则仅仅就是用来处理字符串的:匹配、捕获
匹配:验证当前的字符串是否符合我们的规则(每一个正则都是一个规则)
捕获:在整个字符串当中,把符合规则的字符都依次的获取到--->exec、match、replace
2、正则的组成:元字符、修饰符
元字符:
特殊意义的元字符:
\d匹配一个0-9的数字相当于[0-9],和它相反的
\D匹配一个除了0-9的任意字符相当于【】
\w匹配一个0-9、a-z、A-Z_ 的数字或字符,相当于[0-9a-zA-Z_] 、
\s匹配一个空白字符(空格、制表符。。。)
\b匹配一个单词的边界 “w100 w000”
\t匹配一个制表符
\n匹配一个换行
. 匹配一个除了\n以外的任意字符
^ 以某一个元字符开头
$ 以某一个元字符结尾
\ 转译字符
x|y x或者y的一个
[xyz] x、y、z、中的任意一个
[^xyz]除了x、y、z、中的任意一个
[a-z] -> 匹配a-z中的任意一个字符
[^a-z] -> 匹配除了a-z中的任意一个字符
() 正则中的分组
量词:
* 0到多个
+ 1到多个
"2015"--->2
("2015zhufeng2016peixun"
var reg = /\d+/;
第一项是我们捕获的内容
index:捕获的内容在元字符串中开始的索引位置
input:捕获的原始字符串
2、正则的捕获是懒惰的
正则的每一次捕获都从lastIndex值开始,第一次捕获的时候,lastIndex=0,从原始字符串索引为0的位置开始查找捕获,而默认的情况下,第一次捕获完成,lastIndex的值并没有发生改变,还是0,所以第二次捕获还是从原始字符串索引为0处开始查找,这样找到的还是第一次捕获的内容
解决办法:添加全局修饰符g--->加上g后,第一次捕获完成后,lastIndex的值发生了改变,变为第一次捕获内容后的第一个字符的开始索引,第二次捕获是继续向后查找的...
疑问:不用全局修饰符g每次捕获完成后手动修改lastIndex的值不可以么?
不可以,虽然手动修改了lastIndex,确实把lastIndex的值进行改变了,但是正则查找的时候还是从索引0开始的
var str = "zhufeng2015peixun2016"; var reg = /\d+/g;
例子
为了防止没有加全局修饰符g导致的死循环,我们在处理之前,对于没有添加g的手动给添加一个g
RegExp.prototype.myExecAll = function myExecAll() { var _this = this, str = arguments[0], ary = [], res = null; !_this.global "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多好啊"htmlcode">
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]
。。。。。
分组的只匹配不捕获:我们如果执行把分组内容进行匹配但是不进行捕获的话,只需要在分组的前面加上"htmlcode">
var str = "zhufeng[2015]peixun[2016]"; var reg = /\[("[2015]", "015"...]
数组中的第一项是大正则捕获的内容 res[0]
数组中的第二项是第二个分组捕获的内容 res[1]
第一个分组添加了"htmlcode">
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+"2", "0", "1", "5", "2", "0", "1", "6"]
7、分组引用
\2代表出现和第二个分组一模一样的内容
\1代表出现和第一个分组一模一样的内容
var reg=/^(\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捕获的原理是一模一样的
例如:我们第二个参数如果传递的是一个函数,每当正则在字符串中捕获一次当前的这个函数就执行一次 ->本题中一共捕获了两次,所以函数执行了两次
var str = "zhufeng2015 zhufeng2016"; str = str.replace(/zhufeng/g, function () {
2)参数问题
console.dir(arguments);
不仅仅是执行function,而且还给我们的函数传递了参数,并且传递的参数和每一次exec捕获的内容是一模一样的
如果是第一次exec捕获->["zhufeng",index:0,input:"原始字符串"]
第一次执行函数里面的参数
arguments[0] -> "zhufeng"/**/
arguments[1] -> 0 相当于exec中的index 开始捕获的索引位置
arguments[2] -> "原始字符串" 相当于exec中的input
3)返回值问题
return返回的是什么,就相当于把当前捕获的内容替换成什么
return "zhufengpeixun"; }); console.log(str);
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 老头杯第二届规则是什么 英雄联盟老头杯第二届规则介绍
- 王崴-爵士听堂.蓝色波萨(HQCD)[WAV+CUE]
- 群星《欧美动听情歌·柔情第5季》2CD【DTS-WAV分轨】
- [极品珍藏]德意志进行曲集卡拉扬SACD[WAV+CUE]
- 前暴雪制作人呼吁反击DEI 玩家:夺回文化!
- 腾讯证实子公司Sharkmob大规模裁员:整个市场很低迷
- 荣耀加冕 问鼎冠军 中国代表队获第四届东亚电竞锦标赛团体总冠军
- 污甩乐队.2024-Let.the.dirt.left【摩登天空】【FLAC分轨】
- 杜德伟.1994-ALL.FOR.YOU(英)【滚石】【WAV+CUE】
- 群星.2013-百代好声音ADMSCD1【EMI百代】【WAV+CUE】
- 群星《私人音乐精选示范碟》PRIVATEMUSIC 发烧唱片名碟[WAV+CUE][1.1G]
- 山口百惠《あなたへの子守唄》日本索尼钢刻字首版[WAV分轨][1.1G]
- 群星《宝丽金20周年特别发烧版》1:1母盘直刻限量编号[低速原抓WAV+CUE][1G]
- 凤飞飞.1984-仲夏(夏艳)[WAV]
- 常安《民歌红·江南燕》DTS-ES6.1[WAV]