JS正则表达式

常用正则

元字符

在正则中有特殊语义的字符;.[][^]?*+{min,max}^$()\1\2|

转义符
表示方法

\

作用

用于匹配元字符

匹配方式
  • test只返回是否匹配成功,不能精确匹配,例如console.log(/\d{2}/.test('13a')) //true
  • exec可以精确匹配,会返回匹配的内容、开始匹配的位置和输出
字符组
表示方法

[]

作用

在固定范围内匹配一个字符

示例
console.log(/[1-9]/.test('1')) //true
console.log(/[a-z]/.test('a')) //true
console.log(/[0-9a-zA-Z]/.test('a')) //true
console.log(/[^1-9a-zA-Z]/.test('0')) //true
注意点
  • 要注意顺序,比如写1-9可以匹配,但是写成9-1就不可匹配,字符的顺序由ASCII码所决定,多个范围之间时没有前后顺序的,例如代码示例三可以写成/[A-Z0-9a-z]/
取反

在第一个范围前面添加^符号,值得注意的是^只是一个字符而非元字符,因此可以直接进行正则匹配,而不需要进行转义

简写
  • \d表示[0-9]\D表示[^0-9]
  • \w表示[0-9a-zA-Z]\W表示[^0-9a-zA-z]
  • \s表示[\f\n\r\t...]空白字符、\S表示[^\f\n\t\r...]
量词

使用{n}表示匹配的字符出现的次数,仅用于匹配紧靠着的前面一个字符

  • {n}表示匹配n次
  • {n,m}表示匹配最少n次,最多m次
  • {n,}表示最少匹配n次,最多无限次
量词简写
  • ?表示{0,1}即0次或一次
  • *表示{0,}即表示任意次数
  • +表示{1,}即表示至少一次
匹配方法
贪婪模式(默认)

在进行量词匹配时,尽可能多的匹配

示例
console.log(/a+/.exec('aaaaaa')) //true
非贪婪模式

在进行量词匹配时,尽可能少的匹配

示例
console.log(/a{1,}?/.exec('aaaa')) 
console.log(/a+?/.exec('aaaa')) //在简写或非简写后面添加?即可
括号的用法
分组

分组即子表达式,配合exec方法可以获取每次匹配的内容

示例
console.log(/(ab){2}/.exec('abab')); //即匹配ab两次
console.log(/(\d{4})-(\d{1,2})-(\d{1,2})/.exec('2020-9-14')) 
//可以匹配成功,并且可以使用RegExp.$1,RegExp.$2,RegExp.$3分别获取2020、9和14
引用

引用用于捕获子表达式

反向引用

有时候我们需要使用第一个表达式所匹配的结果,就需要使用反向引用

使用方法

将依赖的匹配使用()修饰,在后面需要使用依赖匹配的结果时使用\1即可

示例
console.log(/[a-z]{2}/.exec('ab'))
console.log(/([a-z])\1/.exec('bb'))
console.log(/<([^<>]+)>[\w\W]*<\/\1>/.exec('<h1><h1>123</h1></h1>'))
非捕获

当我们一个正则表达式中存在多个引用,有时候我们不希望其返回结果,这时就可以使用非捕获来实现

使用方法

在不希望返回结果的匹配后面使用?:来修饰,使用非捕获后就exec方法就不会产生子表达式

示例
console.log(/(?:abc){2}/.exec('abcabc'))
分支

自左向右匹配,一旦匹配上,就不再回头

示例
//只会匹配12
console.log(/12|34|56/.exec('123456')) 
//匹配0-255并获取子表达式,核心思想是分隔范围,从250-255|200-249|100-199|10-99|0-9
console.log(/25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d/.exec('168'))
断言
判断边界

可以使用\b来判断字符是否在边界,相对应的可以使用\B来匹配不在边界的字符

console.log(/\ban/.test('anapple')) //true
console.log(/an\b/.test('aan apple')) //true
console.log(/\ban/.test('aanapple')) //false
判断开头结尾

可以用^an修饰来表示开头匹配an,可以使用le$来表示结尾匹配le

环视

可以使用/a(?=b)/表示匹配紧跟着ba,不匹配内容,即不能获取子表达式

console.log(/a(?=b)/.exec('abc')) //成功匹配

可以使用/a(?!b)/表示匹配非紧跟着ba

console.log(/a(?!b)/.test('acb')) //匹配成功
匹配模式
  • g表示全局匹配
  • i表示忽略大小写
  • m表示多行匹配
示例
console.log('1a2a3a'.replace(/a/,'b')) //1b2a3a
console.log('1a2a3a'.replace(/a/g,'b')) //1b2b3b
console.log(/a/.exec('Ab')) //不能成功匹配
console.log(/a/i.exec('Ab')) //可以成功匹配
console.log(/world$/.exec(hello world\n)) //匹配失败
console.log(/world$/m.exec(hello world\n)) //成功匹配
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值