js中的正则
| 基础字符表 | |
| \b | 匹配一个单词边界 |
| \B | 匹配一个非单词边界 |
| ^ | 匹配字符串开始位置 |
| $ | 匹配字符串结束位置 |
| [] | 匹配任意方括号中任意一个原子 |
| [^] | 匹配除方括号中的原子 |
| . | 匹配除换行符之外的任意字符 |
| \d | 匹配一个数字 |
| \D | 匹配一个非数字 |
| \w | 匹配一个字母,数字或下划线 |
| \W | 配一个非字母,数字或下划线 |
| \s | 匹配一个不可见原子 |
| \S | 匹配一个非不可见原子 |
| {n} | 表示前面的原子恰好出现n次 |
| {n,m} | 表示前面的原子出现n到m次 |
| {n,} | 表示前面的原子最少出现n次 |
| * | 即{0,} |
| + | 即{1,} |
| ? | 即{0,1} |
| 需要转义的字符(元字符)表 | |||||||||||||
| \ | ^ | $ | . | | | ? | * | + | ( | ) | [ | ] | { | } |
正则匹配总是贪婪的,使用?可以关闭贪婪
reg = /a{1,3}/
reg.exec('aaa') //["aaa", index: 0, input: "aaa"]
reg = /a{1,3}?/
reg.exec('aaa') //["a", index: 0, input: "aaa"]
分组和反向引用:
圆括号分组,使用()包裹的表达式被称为一个组。在后面的表达式中可以使用\1来进行反向引用,这个数字是从左到右自动进行编号的,多个嵌套的话也是从里到外进行编号的。
reg = /(a|b)\1/ reg.exec('aa') //["aa", "a", index: 0, input: "aa"]
需要注意的是,这个\1指代的不是a|b这个正则表达式,而是指代的被a|b匹配的内容,如下
reg = /(a|b)\1/ reg.exec('ab') //null,因为前面的(a|b)匹配的是a,所以\1也是指代的a
在括号中使用?: 如(?:a)就不会被捕获编号
reg = /(?:a|b)(c|d)\1/ reg.exec('acc') //["acc", "c", index: 0, input: "acc"] 输出的结果中,没有了(?:a|b)中匹配的内容,而且/1也是引用的(c|d)中匹配到的c
我们也可以给分组进行命名,就可以不使用编号来进行反向引用,命名方式为(?<name>a|b) 引用方式为\k<name>
reg = /(?<name>a|b)\k<name>/
reg.exec('aa') //["aa", "a", index: 0, input: "aa", groups:{name: "a"}] ,匹配的结果相同,只是输出的时候多了一个groups
预匹配:
预匹配就是先看后面的是否符合匹配规则,然后再决定前面的是否匹配,比如
reg = /a(?!b)/ //表示匹配后面没有b的a字符串 reg.exec('ac') //["a", index: 0, input: "ac"] reg.exec('ab') //null
同时,匹配的结果也不会包含括号中的内容,比如匹配reg.exec('ac')匹配的就不是ac,而是a
同样的,还有以下几个预匹配
reg = /a(?=b)/ //表示匹配后面有b的a字符串 reg.exec('ab') //["a", index: 0, input: "ab"] reg.exec('ac') //null reg = /(?<=a)b/ //表示匹配前面有a的b字符串 reg.exec('ab') //["b", index: 1, input: "ab"] reg = /(?<!a)b/ //表示匹配前面没有a的b字符串 reg.exec('cb') //["b", index: 1, input: "cb"]
RegExp对象:
可以使用下面两种方式来定义RegExp对象:
reg = /abc/g reg = new RegExp('abc', 'g')
exec方法的参数是待匹配的字符串,返回值为null或者数组,如果匹配到的话,会返回匹配的文本,如果表达式有分组的话还会返回分组中匹配的部分,还有index属性表示匹配开始的位置,input表示输入的字符串,如果有使用分组命名的话,还会有一个groups属性表示名称
reg = /(?<name>a|b)\k<name>/ reg.exec('aa') //["aa", "a", index: 0, input: "aa", groups:{name: "a"}] ,匹配的结果相同,只是输出的时候多了一个groups
test方法的参数也是待匹配的字符串,匹配成功返回true,否则为false
reg = /a/ reg.test('b') //false
string对象中的正则:
search方法:返回匹配到的起始位置,匹配失败返回-1
'abc'.search(/b/) //1
match方法:同RegExp对象的exec方法
replace方法:第一个参数regexp为要替换的文本,可以为字符串或者正则,第二个参数replacement用来替换匹配的文本,replacement可以为字符串或者函数,如果为字符串的话,将直接进行替换,如果replacement中有$字符的话,将有特殊的含义
| $1、$2、...、$99 | 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。 |
| $& | 与 regexp 相匹配的子串。 |
| $` | 位于匹配子串左侧的文本。 |
| $' | 位于匹配子串右侧的文本。 |
| $$ | 直接量符号。 |
如果replacement为函数的话,那么函数参数和match方法的返回值一致,返回的值就是用来替换匹配的文本。

浙公网安备 33010602011771号