1. 创建
在 JavaScript 中,可以通过两种方式创建一个正则表达式。
(1)通过调用 RegExp
对象的构造函数创建
const regexp = new RegExp(正则表达式, 标志);
(2)利用字面量创建正则表达式
const rg = /正则表达式/[可选的标志];
2. 标志
标志 | 描述 |
---|---|
g | 全局搜索 |
i | 不区分大小写搜索 |
m | 多行搜索 |
s | 允许 . 匹配换行符 |
u | 使用unicode码的模式进行匹配 |
y | 执行**粘性(sticky)**搜索,匹配从目标字符串的当前位置开始 |
3. 字符
一个正则表达式可以由简单的字符构成,比如 /abc/
,也可以是简单和特殊字符的组合,比如 /ab*c/
。其中特殊字符也被称为元字符,在正则表达式中是具有特殊意义的专用符号,如 ^
、$
、+
等。
特殊字符非常多,可参考:[MDN]
1. 断言
1. 边界类断言
(1)^
匹配输入的开头。如果多行模式设为 true,在换行符后也能立即匹配。
^
出现在集合或范围开头时的含义与此不同。
(2)$
匹配输入的结束。如果多行模式设为 true,在换行符前也能立即匹配。
(3)\b
匹配一个单词的边界。
const reg1 = /\b/g;
const reg2 = /xx\b/g;
const reg3 = /\bs/g;
const str = 'sdfxx sfadf';
const arr1 = str.match(reg1); // [ '', '', '', '' ] 两个单词,一共四个边界
const arr2 = str.match(reg2); // [ 'xx' ] 以xx结尾
const arr3 = str.match(reg3); // [ 's', 's' ] 以s开头
(4)\B
匹配非单词边界。
例如,/xx\B/
匹配非xx
结尾,/\Bs/
匹配非s
开头。
2. 其他断言
(1)x(?=y)
向前断言:x
被y
跟随时匹配x
。
例如,对于/Jack(?=Sprat)/
,Jack
在跟有Sprat
的情况下才会得到匹配。
/Jack(?=Sprat|Frost)/
,Jack
后跟有Sprat
或Frost
的情况下才会得到匹配。
不过,匹配结果不包括Sprat
或Frost
。
(2)x(?!y)
向前否定断言:x
没有被y
紧随时匹配x
。
例如,对于/\d+(?!\.)/
,数字后没有跟随小数点的情况下才会得到匹配。
/\d+(?!\.)/.exec(3.141)
,匹配141
而不是3
。
(3)(?<=y)x
向后断言:x
跟随y
的情况下匹配x
。
例如,对于/(?<=Jack)Sprat/
,Sprat
紧随Jack
时才会得到匹配。
/(?<=Jack|Tom)Sprat
,Sprat
在紧随Jack
或Tom
的情况下才会得到匹配。不过,匹配结果中不包括Jack
或Tom
。
(4)(?<!y)x
向后否定断言:x
不跟随y
时匹配x
。
例如,对于/(?<!-)\d+/
,数字不紧随-
符号的情况下才会得到匹配。
/(?<!-)\d+/.exec(3)
,3
得到匹配。
而/(?<!-)\d+/.exec(-3)
的结果无匹配,这是由于数字之前有-
符号。
2. 字符类
(1).
- 匹配除行终止符之外的任何单个字符
- 在字符集内,
.
失去了它的特殊意义,并与文字点匹配
(2)\d
匹配任何数字,相当于[0-9]
。
(3)\D
匹配任何非数字,相当于[^0-9]
。
(4)\w
匹配字母+数字+下划线,相当于[A-Za-z0-9_]
。
(5)\W
匹配字母+数字+下划线以外的字符,相当于[^A-Za-z0-9_]
。
(6)\s
匹配任意一个空格(包括换行符、制表符、空格符等),相当于[\t\r\n\v\f]
。
(7)\S
匹配任意一个非空格符,相当于[^\t\r\n\v\f]
。
(8)\t
、\r
、\n
、\v
、\f
符号 | 说明 |
---|---|
\t | 匹配一个制表符。等价于\x09 和\cI |
\r | 匹配一个回车符。等价于\x0d 和\cM |
\n | 匹配一个换行符。等价于\x0a 和\cJ 。 |
\v | 匹配一个垂直制表符。等价于\x0b 和\cK |
\f | 匹配一个换页符。等价于\x0c 和\cL |
3. 组、范围
(1)x|y
匹配``x或
y`。
例如,/green|red/
在green apple
里匹配green
,且在red apple
里匹配red
。
(2)[xyz]
、[a-c]
字符集。 匹配任何一个包含的字符。可以使用连字符来指定字符范围,但如果连字符为方括号中的第一个或最后一个字符,则它将被视为作为普通字符包含在字符集中的文字连字符。也可以在字符集中包含字符类。
例如,[abcd]
与[a-d]
等价。
[abcd-]
和[-abcd]
将会在brisket
匹配b
, 在chop
匹配c
,并且匹配non-profit
中的-
。
[\w-]
与[A-Za-z0-9_-]
等价。
(3)[^xyz]
匹配任何没有包含在括号中的字符。
(4)(x)
捕获组:匹配x
并记住匹配项。
例如,/(foo)/
匹配并记住foo bar
中的foo
。
(5)(?:x)
非捕获组:匹配x
,但不记得匹配。
4. 量词
符号 | 说明 |
---|---|
x* | 重复0次或更多次 |
x+ | 重复1次或更多次 |
x? | 重复0次或1次 |
x{n} | 重复n次 |
x{n,} | 重复n次或更多次 |
x{n,m} | 重复n到m次 |
x*? x+? x?? x{n}? x{n,}? x{n,m}? | 默认情况,* 和+ 这样的量词是贪婪的,试图匹配尽可能多的字符串。加? 使量词非贪婪:意思是它一旦找到匹配就会停止。 |
4. 常用方法
1. replace
replace()
方法可以实现替换字符串操作,用来替换的参数可以是一个字符串或是一个正则表达式。
str.replace(regexp/substr,replacement)
- 第一个参数:被替换的字符串 或者 正则表达式
- 第二个参数:替换为的字符串
返回值是一个替换完毕的新字符串。
2. test
test()
法执行一个检索,查看正则表达式与指定的字符串是否匹配。
regexObj.test(str)
返回true
或false
。
const str = 'hello world!';
const result = /^hello/.test(str);
console.log(result); // true
3. match
match()
方法检索返回一个字符串匹配正则表达式的结果。
str.match(regexp)
返回值:
- 如果使用
g
标志,则将返回与完整正则表达式匹配的所有结果,但不返回捕获组。 - 如果未使用
g
标志,则仅返回第一个完整匹配及其相关的捕获组(Array
)。 在这种情况下,返回的项目将具有如下所述的其他属性。groups
:一个捕获组数组或undefined
index
:匹配的结果的开始位置input
:搜索的字符串
如果正则表达式不包含g
标志,将返回与RegExp.exec()
相同的结果。
4. matchAll
matchAll()
方法返回一个包含所有匹配正则表达式的结果及分组捕获组的迭代器。
str.matchAll(regexp)
regexp
必须是设置了全局模式g
的形式,否则会抛出异常TypeError
。
5. search
search()
方法执行正则表达式和字符串的搜索匹配。
str.search(regexp)
如果匹配成功,则search()
返回正则表达式在字符串中首次匹配项的索引;否则,返回-1
。
6. split
split()
方法使用指定的分隔符将字符串分割成子字符串数组。
str.split([separator[, limit]])
separator
:指定表示每个拆分应发生的点的字符串。可以是一个字符串或正则表达式limit
:可选,一个整数,限定返回的分割片段数量。
返回原字符串以分隔符出现位置分隔而成的数组。
7. exec
exec()
方法在一个指定字符串中执行一个搜索匹配。
regexObj.exec(str)
如果匹配成功,返回一个数组(属性index
和input
),并更新正则表达式对象的lastIndex
属性。完全匹配成功的文本将作为返回数组的第一项,从第二项起,后续每项都对应正则表达式内捕获括号里匹配成功的文本。
如果匹配失败,返回null
,并将lastIndex
重置为0
。