正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
在 JavaScript
中,正则表达式也是对象。这些模式被用于 RegExp
的 exec
和 test
方法,以及 String
的 match
、matchAll
、replace
、search
和 split
方法。
量词
量词表示要匹配的字符或表达式的数量。默认情况下,量词是“贪婪的”,这意味着它们试图匹配尽可能多的字符串。如果在量词的后面紧跟
?
,如:*?
、+?
、??
、{1,3}?
等,将会使量词变为非贪婪(匹配尽量少的字符)。例如,对 "123abc" 使用/\d+/
将会匹配 "123",而使用/\d+?/
则只会匹配到 "1"
字符 | 含义 |
---|---|
* | 匹配前面一个表达式 0 次或者多次。等价于 {0,} |
+ | 匹配前面一个表达式 1 次或者多次。等价于 {1,} |
? | 匹配前面一个表达式 0 次或者 1 次。等价于 {0,1} |
{n} | n 是一个正整数,匹配了前面一个字符刚好出现了 n 次 |
{n,} | n 是一个正整数,匹配前一个字符至少出现了 n 次 |
{n,m} | n 和 m 都是整数。匹配前面的字符至少 n 次,最多 m 次。如果 n 或者 m 的值是 0,这个值被忽略 |
字符类
字符类可以区分各种字符,例如区分字母和数字
字符 | 含义 |
---|---|
. | 匹配除换行符之外的任何单个字符 |
\d | 匹配一个数字。等价于 [0-9] |
\D | 匹配一个非数字字符。等价于 [^0-9] |
\s | 匹配一个空白字符,包括空格、制表符、换页符和换行符 |
\S | 匹配一个非空白字符 |
\w | 匹配一个单字字符(字母、数字或者下划线)。等价于 [A-Za-z0-9_] |
\W | 匹配一个非单字字符。等价于 [^A-Za-z0-9_] |
组和范围
组和范围表示表达式字符的组和范围
字符 | 含义 |
---|---|
x|y | 匹配 'x' 或者 'y' |
[xyz] 、[0-9] | 一个字符集合。匹配方括号中的任意字符,包括转义序列。你可以使用破折号 - 来指定一个字符范围。对于点 . 和星号 * 这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义,不过转义也是起作用的 |
[^xyz] 、[^0-9] | 一个反向字符集。也就是说,它匹配任何没有包含在方括号中的字符 |
(x) | 捕获组:它会匹配 'x' 并且记住匹配项 |
(?:x) | 非捕获组:匹配 'x' 但是不记住匹配项 |
\n | 其中 n 是一个正整数。表示第 n 个被捕获括号匹配的子字符串(计算左括号),注意 \1 、\2 、...、\n 是用在正则表达式的匹配环节,而在正则表达式的替换环节,则要使用像 $1 、$2 、...、$n 这样的语法 |
(?<Name>x) | 具名捕获组:匹配 'x' 并将其存储在返回的匹配项的 groups 属性中,该属性位于<Name> 指定的名称下。尖括号(< 和 > ) 用于组名。 |
断言
断言的组成之一是边界。对于文本、词或模式,边界可以用来表明它们的起始或终止部分(如向前断言,向后断言以及条件表达式)
边界类断言
字符 | 含义 |
---|---|
^ | 匹配输入的开始 |
$ | 匹配输入的结束 |
\b | 匹配单词的边界,这是一个字的字符前后没有另一个字的字符位置, 例如在字母和空格之间 |
\B | 匹配非单词的边界 |
其他断言
字符 | 含义 |
---|---|
x(?=y) | 向前断言:匹配 'x' 仅当 'x' 后面跟着 'y' |
x(?!y) | 向前否定断言:匹配 'x' 仅当 'x' 后面不跟着 'y' |
(?<=y)x | 向后断言:匹配 'x' 仅当 'x' 前面是 'y' |
(?<!y)x | 向后否定断言:匹配 'x' 仅当 'x' 前面不是 'y' |
标志
标志 | 描述 |
---|---|
g | 全局搜索 |
i | 不区分大小写搜索 |
m | 多行搜索 |
s | 允许 . 匹配换行符 |
u | 使用 unicode 码的模式进行匹配 |
y | 执行“粘性(sticky )”搜索,匹配从目标字符串的当前位置开始 |