JS正则表达式

本文介绍了正则表达式中的捕获组概念,包括如何在JavaScript中使用括号捕获内容,以及如何通过RegExp.$1访问捕获的子匹配。同时,讲解了使用(?:)消除捕获组副作用的方法。还探讨了反向引用在查找重复单词中的应用。此外,详细阐述了replace()方法的用法,特别是其作为方法参数的函数处理匹配内容的方式。
摘要由CSDN通过智能技术生成

捕获组:在正则中,括号中的内容或者匹配到的内容叫做捕获组

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值