正则表达式

正则测试
正则图

元字符

分类 符号 含义
特殊单字符 . 任意字符(换行除外)
特殊单字符 \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* 可以匹配 aababb
+ {1,} 1 到多次 ab+ 可以匹配 ababb 等,但不能匹配 a
? {0,1} 0 到 1 次 ab? 可以匹配 aab,但不能匹配 abb

贪婪匹配(Greedy)

尽可能进行最长匹配

用法:贪婪匹配为默认模式,如 a*

匹配不上会回溯

字符串   aaabb
下标     012345
匹配 开始 结束 说明 匹配内容
第1次 0 3 到第一个字母b发现不满足,输出aaa aaa
第2次 3 3 匹配剩下的bb,发现匹配不上,输出空字符串 空字符串
第3次 4 4 匹配剩下的b,发现匹配不上,输出空字符串 空字符串
第4次 5 5 匹配剩下空字符串,输出空字符串 空字符串

懒惰匹配(Lazy)

尽可能进行最短匹配

用法:在贪婪匹配后加 ?,如 a*?

匹配不上不会回溯

|700

独占匹配(Possessive)

与贪婪模式类似,尽可能进行最长匹配,如果匹配失败就结束,

不会进行回溯,比较节省时间。

用法:“数量”元字符后加 + 。如 a*+

模式 正则 文本 结果
贪婪模式 a{1,3}ab aaab 匹配
非贪婪模式 a{1,3}?ab aaab 匹配
独占模式 a{1,3}+ab aaab 不匹配

后面匹配不上,会吐出已匹配的再尝试

分组与引用

  • 将某部分(子表达式)看成一个整体
  • 在后续查找或替换中引用分组

分组与编号

括号在正则中可以用于分组,被括号括起来的部分“子表达式”会被保存成一个子组。第几个括号就是第几个分组。

|600

非捕获分组

在括号里面的会保存成子组,但有些情况下,你可能只想用括号将某些部分看成一个整体,后续不用再用它。

用法:在括号中使用 ?:

类型 正则 示例
保存子组 (正则) \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)

通常 . 不能匹配换行符,使用点号通配模式可以匹配上换行符

|500

也可以使用 [\s\S][\d\D][\w\W] 等实现匹配真正任意字符

多行匹配模式(Multiline)

用法:正则前添加模式修饰符 (?m)

通常 ^ 匹配整个字符串的开头, $ 匹配整个字符串的结尾

多行匹配模式下会匹配每行的开头或结尾

|500

正则中还有\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 不支持逆向环视(逆向断言)