学习正则的网站: https://regexlearn.com/zh-cn/learn/
基础速查: https://regexlearn.com/zh-cn/cheatsheet
1. 限定字符集
符号/模式 | 描述 | 示例 | 解释 |
---|---|---|---|
. |
匹配任意字符(除换行符外) | /a.b/ |
匹配 "a" 后面跟着的一个任意字符,再跟 "b" |
[] |
定义字符集 | /b[aeo]r/ |
匹配结果 barber birbor bur |
[^] |
定义否定字符集 | /b[^aeo]r/ |
匹配结果 bar berbir borbur |
[a-z] |
匹配小写字母字符(a 到 z) | /[a-z]/ |
匹配任意一个小写字母 |
[A-Z] |
匹配大写字母字符(A 到 Z) | /[A-Z]/ |
匹配任意一个大写字母 |
[0-9] |
匹配数字字符(0 到 9) | /[0-9]/ |
匹配任意一个数字 |
\d |
匹配任何数字(0-9) | /\d/ |
匹配任意一个数字 |
\D |
匹配任何非数字字符 | /\D/ |
匹配任何非数字字符 |
\w |
匹配任何字母数字或下划线字符 | /\w/ |
匹配任意一个字母、数字或下划线 |
\W |
匹配任何非字母数字或下划线字符 | /\W/ |
匹配任何非字母数字或下划线字符 |
\s |
匹配任何空白字符(如空格、制表符、换行符等) | /\s/ |
匹配任意空白字符 |
\S |
匹配任何非空白字符 | /\S/ |
匹配任何非空白字符 |
\b |
匹配单词边界(如空格、标点等) | /\bword\b/ |
匹配完整的 "word" |
注意: 没有限定出现次数, 则默认都是一次
2. 限定次数
符号 | 含义 | 示例 | 解释 |
---|---|---|---|
* |
匹配零个或多个前面的元素 | /ab*c/ |
匹配 "ac", "abc", "abbc" 等 |
+ |
匹配一个或多个前面的元素 | /ab+c/ |
匹配 "abc", "abbc" 等 |
? |
匹配零个或一个前面的元素 | /ab?c/ |
匹配 "ac" 或 "abc" |
{n} |
匹配前一个字符恰好出现 n 次 | /a{3}/ |
匹配 "aaa" |
{n,} |
匹配前一个字符至少 n 次 | /a{2,}/ |
匹配 "aa", "aaa", "aaaa", "aaaa", ... |
{n,m} |
匹配前一个字符至少 n 次,但不超过 m 次 | /a{2,4}/ |
匹配 "aa", "aaa", "aaaa" |
3. 限定位置
符号 | 含义 | 示例 | 解释 |
---|---|---|---|
^ |
匹配字符串开始 | /^abc/ |
匹配以 "abc" 开头的字符串 |
$ |
匹配字符串结束 | /abc$/ |
匹配以 "abc" 结尾的字符串 |
4. 分组和引用
符号 | 含义 | 示例 | 解释 |
---|---|---|---|
() |
捕获分组 | /(abc)+/ |
匹配一个或多个 "abc" 字符串 |
\数字 |
引用, 可以对捕获分组进行引用 | /(ha)-\1,(haa)-\2/ |
匹配结果 ha-ha,haa-haa |
(?:) |
非捕获分组, 即该分组无法被引用 | /(?:ha)-ha,(haa)-\1/ |
匹配结果 ha-ha,haa-haa |
5. 转义和选择
符号 | 含义 | 示例 | 解释 |
---|---|---|---|
| |
选择 | /(c|r)at|dog/ |
匹配结果 cat rat dog |
\ |
转义字符{ } [ ] / \ + * . $ ^ | ? |
/(\*|\.)/ |
匹配结果 (* ) Asterisk. 123** |
注意: 在字符集[]内部, 只有这些才需要转义 - ^ ] \
, 因为其他的字符在字符集中只会被当做普通字符
6. 标志符 ( 修饰符 / 标记 )
标志符 | 描述 | 示例 |
---|---|---|
g |
全局匹配:查找所有匹配的结果,而不是只匹配第一个。 | /a/g 在字符串中查找所有 "a" 字符。 |
i |
不区分大小写:匹配时忽略字母的大小写。 | /a/i 可以匹配 "a" 或 "A"。 |
m |
多行匹配:影响^ 和$ 的行为,变为匹配每行的开头和结尾。 |
/^abc/m 可以匹配以 "abc" 开头的多行文本。 |
s |
单行模式:影响. 的行为,变为允许. 匹配换行符。 |
/a.b/s 匹配 "a" 和 "b" 之间有换行符的字符串。 |
u |
Unicode 模式:启用 Unicode 匹配,支持 Unicode 字符。 | /\u{20AC}/u 匹配 Unicode 字符 "€"。 |
7. 零宽断言
-
场景: 如果我们希望正在写的词语出现在另一个词语之前或之后,我们需要使用「零宽断言」
-
正向先行断言:
(?=)
- 说明: 匹配的某个模式后面符合另一个模式
- 例子: Date: 4 Aug 3PM 匹配文本中的小时值
- 解析: 为了只匹配后面有 PM 的数值,我们需要在表达式后面使用正向先行断言 (?=),并在括号内的 = 后面添加 PM。
- 答案:
/\d+(?=PM)/
匹配结果 Date: 4 Aug3
****PM - 巧记:
?
后面有没有,=
有
-
负向先行断言:
(?!)
- 说明: 匹配的某个模式后面不符合另一个模式
- 例子: Date: 4 Aug 3PM 匹配文本中除小时值以外的数字。
- 解析: 我们需要在表达式后面使用负向先行断言 (?!),并在括号内的 ! 后面添加 PM,从而只匹配没有 PM 的数值。
- 答案:
/\d+(?!PM)/
匹配结果 Date:4
Aug 3PM - 巧记:
?
后面有没有,!
没有
-
正向后行断言:
(?<=)
- 说明: 匹配的某个模式前面符合另一个模式
- 例子: Product Code: 1064 Price: $5 匹配文本中的金额数。
- 解析: 为了只匹配前面带有 $ 的数字。我们要在表达式前面使用正向后行断言 (?<=),并在括号内的 = 后面添加 $。
- 答案:
/(?<=\$)\d+/
匹配结果 Product Code: 1064 Price: $5
** - 巧记:
?<
前面有没有,=
有
-
负向后行断言:
(?<!)
- 说明: 匹配的某个模式前面不符合另一个模式
- 例子: Product Code: 1064 Price: $5 匹配文本中除价格外的数字。
- 解析: 为了只匹配前面没有 $ 的数字,我们要在表达式前用负向后行断言 (?<!),并在括号内的 ! 后面添加 $。
- 答案:
/(?<!\$)\d+/
匹配结果 Product Code:1064
Price: $5 - 巧记:
?<
前面有没有,!
没有
-
注意:
- 断言不会消耗字符 !!!
8. 匹配模式
-
贪婪匹配
- 说明: 使用
*
,+
,?
,{n, m}
默认就是贪婪模式 - 特点: 尽可能多地匹配字符,直到整个表达式不再匹配为止。
- 例子:
/.*r/
匹配结果ber beer beeer beeeer
- 说明: 使用
-
懒惰匹配
- 说明: 在
*
,+
,?
,{n, m}
后面加?
就会变成懒惰模式, 如*?
,+?
,??
,{n, m}?
- 特点: 懒惰匹配在第一次匹配成功时停止
- 例子:
/.*?r/
匹配结果ber
beer beeer beeeer
- 说明: 在