元字符
在正则中有特殊语义的字符;.[][^]?*+{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)/
表示匹配紧跟着b
的a
,不匹配内容,即不能获取子表达式
console.log(/a(?=b)/.exec('abc')) //成功匹配
可以使用/a(?!b)/
表示匹配非紧跟着b
的a
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)) //成功匹配