正则表达式
元字符
| 分类 | 符号 | 含义 |
|---|---|---|
| 特殊单字符 | . |
任意字符(换行除外) |
| 特殊单字符 | \d |
任意数字 |
| 特殊单字符 | \D |
任意非数字 |
| 特殊单字符 | \w |
任意字母数字下划线 |
| 特殊单字符 | \W |
任意非字母数字下划线 |
| 特殊单字符 | \s |
任意空白符 |
| 特殊单字符 | \S |
任意非空白符 |
| 分类 | 符号 | 含义 |
|---|---|---|
| 空白符 | \r |
回车符 |
| 空白符 | \n |
换行符 |
| 空白符 | \f |
换页符 |
| 空白符 | \t |
制表符 |
| 空白符 | \v |
垂直制表符 |
| 空白符 | \s |
任意空白符 |
| 分类 | 符号 | 含义 |
|---|---|---|
| 量词 | . |
0 到多次 |
| 量词 | + |
1 到多次 |
| 量词 | ? |
0 到 1 次 |
| 量词 | {m} |
出现 m 次 |
| 量词 | {m,} |
出现至少 m 次 |
| 量词 | {m,n} |
出现 m 到 n 次 |
| 分类 | 符号 | 含义 |
|---|---|---|
| 范围 | | |
或,如 ab|bc 代表 ab 或 bc |
| 范围 | [...] |
多选1,括号中任意单个元素 |
| 范围 | [a-z] |
匹配 a 到 z 之间任意单个元素 |
| 范围 | [^...] |
取反,不能是括号中任意单个元素 |
贪婪模式
量词
| 符号 | 同义符号 | 含义 | 示例 |
|---|---|---|---|
* |
{0,} |
0 到多次 | ab* 可以匹配 a、ab、abb 等 |
+ |
{1,} |
1 到多次 | ab+ 可以匹配 ab、abb 等,但不能匹配 a |
? |
{0,1} |
0 到 1 次 | ab? 可以匹配 a、ab,但不能匹配 abb |
贪婪匹配(Greedy)
尽可能进行最长匹配
用法:贪婪匹配为默认模式,如 a*
匹配不上会回溯
字符串 aaabb
下标 012345
| 匹配 | 开始 | 结束 | 说明 | 匹配内容 |
|---|---|---|---|---|
| 第1次 | 0 | 3 | 到第一个字母b发现不满足,输出aaa | aaa |
| 第2次 | 3 | 3 | 匹配剩下的bb,发现匹配不上,输出空字符串 | 空字符串 |
| 第3次 | 4 | 4 | 匹配剩下的b,发现匹配不上,输出空字符串 | 空字符串 |
| 第4次 | 5 | 5 | 匹配剩下空字符串,输出空字符串 | 空字符串 |
懒惰匹配(Lazy)
尽可能进行最短匹配
用法:在贪婪匹配后加 ?,如 a*?
匹配不上不会回溯

独占匹配(Possessive)
与贪婪模式类似,尽可能进行最长匹配,如果匹配失败就结束,
不会进行回溯,比较节省时间。
用法:“数量”元字符后加 + 。如 a*+
| 模式 | 正则 | 文本 | 结果 |
|---|---|---|---|
| 贪婪模式 | a{1,3}ab |
aaab |
匹配 |
| 非贪婪模式 | a{1,3}?ab |
aaab |
匹配 |
| 独占模式 | a{1,3}+ab |
aaab |
不匹配 |
后面匹配不上,会吐出已匹配的再尝试
分组与引用
- 将某部分(子表达式)看成一个整体
- 在后续查找或替换中引用分组
分组与编号
括号在正则中可以用于分组,被括号括起来的部分“子表达式”会被保存成一个子组。第几个括号就是第几个分组。

非捕获分组
在括号里面的会保存成子组,但有些情况下,你可能只想用括号将某些部分看成一个整体,后续不用再用它。
用法:在括号中使用 ?:
| 类型 | 正则 | 示例 |
|---|---|---|
| 保存子组 | (正则) |
\d{15}(\d{3})? |
| 不保存子组 | (?:正则) |
\d{15}(?:\d{3})? |
命名分组
命名分组的格式为 (?P<分组名>正则)
^profile/(?P<username>\w+)/$
引用分组
|
|
匹配模式
匹配模式(Match Mode):指的是正则中一些改变元字符匹配行为的方式,通过模式修饰符来指定
用法:(?模式标识)正则表达式
可以将多种模式标识放一起 (?标识1标识2)正则表达式
可通过添加括号来改变模式标识作用范围
不区分大小写模式(Case-Insensitive)
用法:正则前添加模式修饰符 (?i)
例:
(?i)cat 不区分大小写的 cat,同 [Cc][Aa][Tt]
匹配两个 cat 时:
| 正则 | 效果 |
|---|---|
(?i)(cat) \1 |
可以匹配前后大小写不同,即 (?i) 范围包扩 \i |
((?i)cat) \1 |
前后大小写必须相同,限制了 (?i) 的范围 |
((?i)(cat)) \1 |
会多出一个子组,和 ((?i)(cat)) \2 效果一样 |
点号通配模式(Dot All)
也叫单行匹配模式(Single Line)
用法:正则前添加模式修饰符 (?s)
通常 . 不能匹配换行符,使用点号通配模式可以匹配上换行符

也可以使用 [\s\S] 或 [\d\D] 或 [\w\W] 等实现匹配真正任意字符
多行匹配模式(Multiline)
用法:正则前添加模式修饰符 (?m)
通常 ^ 匹配整个字符串的开头, $ 匹配整个字符串的结尾
多行匹配模式下会匹配每行的开头或结尾

正则中还有\A 仅匹配整个字符串的开始,\z 仅匹配整个字符串的结束,在多行匹配模式下,它们的匹配行为不会改变,如果只想匹配整个字符串,而不是匹配每一行,用这个更严谨一些。
注释模式(Comment)
正则中书写注释
用法 (?#comment)
例:
(\w+) \1 添加注释后 (\w+)(?#word) \1(?#word repeat again)
断言
单词边界(Word Boundary)
用法:正则中使用\b 来表示单词的边界
tom 单词包含 tom |
\btom 以 tom 开头的单词 |
tom\b 以 tom 结尾的单词 |
\btom\b 只能是 tom |
|
|---|---|---|---|---|
tom |
✅ | ✅ | ✅ | ✅ |
tomorrow |
✅ | ✅ | 🚫 | 🚫 |
atom |
✅ | 🚫 | ✅ | 🚫 |
atomic |
✅ | 🚫 | 🚫 | 🚫 |
\b\w+\b 匹配单词,或者空格分隔的字符串等
行的开始或结束
用法:使用 ^和 $匹配行的开始或结束(多行匹配模式)\A和 \z匹配整个字符串的开始或结束,不受匹配模式的影响。
例如:^\d{6}$匹配六位数字
各平台换行符:
| 平台 | 换行符号 |
|---|---|
| Windows | \r\n |
| Linux | \n |
| macOS | \n |
环视( Look Around)
也称零宽断言
用法:
| 正则 | 名称 | 含义 | 示例 |
|---|---|---|---|
(?<=Y) |
肯定逆序环视 (Positive Lookbehind) | 左边是Y | (?<=\d)th 左边是数字的th, 能匹配 9th |
(?<!Y) |
否定逆序环视 (Negative Lookbehind) | 左边不是Y | (?<!\d)th 左边不是数字的th, 能匹配 health |
(?=Y) |
肯定顺序环视 (Positive Lookahead) | 右边是Y | six(?=\d) 右边是数字的six, 能匹配 six6 |
(?!Y) |
否定顺序环视 (Negative Lookahead) | 右边不是Y | hi(?!\d) 右边不是数字的hi, 能匹配 high |
口诀:
- 左尖括号代表看左边
- 没有尖括号是看右边
- 感叹号是非的意思
表示环视的括号不算做子组
例子:
匹配邮政编码(?<!\d)[1-9]\d{5}(?!\d)
匹配单词(?<!\w)\w+(?!\w)``(?<=\W)\w+(?=\W)``\b\w+\b
JavaScript 不支持逆向环视(逆向断言)