正则表达式 疑难杂症
[]内表达的意思
可以用\转义字符 也可以不用转义字符其实在【】里除了转义字符需要转义其他的字符可以被当做普通字符,不过你非要用转义字符也无所谓如 \. 和 . 是同一效果。
且[]里 不会出现2位数,如[a-z] :
任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
replace里面$0 $1 $2 的意思
看下面代码
var obj = {},
reg = /([^?&#+]+)=([^?&#+]+)/g;
var str = 'https://www.baidu.com?a=1&b=2'
str.replace(reg,function($0,$1,$2){
// 函数会执行多次 每一次相当于一个 exec()返回$0是匹配字符串 $1 $2是分组内容
obj[$1] = $2;
})
这是一个获取url参数和参数值的正则 如 结果为 {a:1, b:2}
仔细看里面有两个分组(),并且每个分组里匹配的是除了?&#+的任意组合字母,也就是参数名,replace函数里的回调函数里有三个参数,这个回调函数会被执行多次,每一次相当于执行一个 exec(),(全局标识符下,每次执行exec()都会顺着往下捕获一个匹配字符串,如第一次执行捕获第一个a=1,第二次执行则捕获到第二个b=2,如果不是全局/g则每次都是捕获第一个匹配字符串)
返回$0是匹配字符串,a=1, $1 $2是分组内容 分别为a 和1,
再来说下exec()
当我们用exec进行捕获时,如果正则没有加’g’标识符,则exec捕获的每次都是同一个,当正则中有’g’标识符时 捕获的结果就不一样了,我们还是来看刚刚的例子
var str = 'abc123cba456aaa789';
var reg = /\d+/g; //此时加了标识符g
console.log(reg.lastIndex)
// lastIndex : 0
console.log(reg.exec(str))
// ["123", index: 3, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)
// lastIndex : 6
console.log(reg.exec(str))
// ["456", index: 9, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)
// lastIndex : 12
console.log(reg.exec(str))
// ["789", index: 15, input: "abc123cba456aaa789"]
console.log(reg.lastIndex)
exec的捕获还受分组()的影响
如
var str = '2017-01-05';
var reg = /-(\d+)/g
// ["-01", "01", index: 4, input: "2017-01-05"]
"-01" : 正则捕获到的内容 也就是replace函数中的 $0
"01" : 捕获到的字符串中的小分组中的内容 $1