捕获组:在正则中,括号中的内容或者匹配到的内容叫做捕获组
var str = '123avc111bbb233'
var strExp = /([a-z])([0-9]+)/g
if(strExp.test(str)) {
console.log(RegExp.$1) // c
console.log(RegExp.$2) // 111
}
var n = str.match(strExp)
if(n) {
console.log(n) // ['c111', 'b233']
console.log(n[0]) // c111
console.log(n[1]) // b233
}
但是如果使用圆括号会有副作用:相关的匹配会被缓存
此时可用 ?: 放在第一个选项前来消除这种副作用,当然,这样就不能使用RegExp.$1来获取捕获组了,str.match仍然是可用的
反向引用:如前面提到的,捕获到的内容会被存储到一个临时缓冲区,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
例如查找重复单词:
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));
该正则表达式的第二部分 \1 是对以前捕获的子匹配项的引用
replace()方法:正则表达式使用最多的方法之一,通常的使用场景,例如-转换为驼峰:
var str = "get-element-by-id";
var reg = /-\w/g; // 匹配横杆以及之后的一个字符,全局匹配
console.log(str.replace(reg,function($0){
return $0.slice(1).toUpperCase();
// 匹配到到是-e -b -i 形式截取后一个字符转成大写
}));
该方法第一个参数可传字符串、正则表达式,第二参数则有些奥妙
第二个参数传入一个方法或者字符串,当传入方法时,可传入4个参数,具体看下面的例子:
'abcdefg'.replace(/a(...).(.)/g,function(a,b,c,d,e,f){
console.log(a,b,c,d,e,f)
})
// 输出 abcdef bcd f 0 abcdefg undefined
a :第一个参数,为正则所匹配到的内容,此处为 abcdef
b、c : 第二个及以后的为 正则表达式中分组的内容,因为有两个 () 所以有两个分组,分别为b,c
d : 匹配成功时所在的位置
e : 整个字符串,此处为 abcdefg
所以你就能理解上一段转换为驼峰的代码中,$0的含义,在这里$0就是第一个参数,注意参数是一一对应的,你可以起任何名字,但位置一定要对的上,此处的$0就是正则匹配到的所有内容,即
-e -b -i