正则表达式元字符详解
元字符(Metacharacters)是正则表达式中最核心的部分,它们不是匹配字面上的自身,而是具有特殊含义的符号,用于描述匹配规则。掌握元字符是写出强大正则的关键。
以下是所有常见元字符的完整列表,按功能分类说明(适用于 JavaScript、Python、Java、PHP 等主流引擎)。
1. 基本元字符(最常用)
| 元字符 | 含义 | 示例 | 匹配示例 | 不匹配示例 |
|---|---|---|---|---|
. | 匹配任意单个字符(除换行符 \n 外) | a.c | “abc”、”a1c”、”a#c” | “ac”(太短)、”a\nc” |
^ | 匹配字符串或行的开头 | ^abc | “abcde” 中的 “abc” | “xabc” |
$ | 匹配字符串或行的结尾 | abc$ | “xyzabc” 中的 “abc” | “abcx” |
\ | 转义字符(使元字符变为普通字符,或普通字符变为特殊) | \. | 匹配 “.” |
2. 量词元字符(控制重复次数)
量词总是作用于前面的一个单元(可以是单个字符、字符集或分组)。
| 元字符 | 含义 | 示例 | 匹配示例 |
|---|---|---|---|
* | 匹配前一个单元 0 次或多次 | ab* | “a”、”ab”、”abbb” |
+ | 匹配前一个单元 1 次或多次 | ab+ | “ab”、”abb”(不匹配 “a”) |
? | 匹配前一个单元 0 次或 1 次 | ab? | “a”、”ab” |
{n} | 匹配前一个单元正好 n 次 | a{3} | “aaa” |
{n,} | 匹配前一个单元至少 n 次 | a{2,} | “aa”、”aaa” 等 |
{n,m} | 匹配前一个单元 n 到 m 次 | a{2,4} | “aa”、”aaa”、”aaaa” |
- 贪婪模式:默认量词是贪婪的(尽可能多匹配)。在量词后加
?变为懒惰模式(尽可能少匹配)。
示例:"a.*b"(贪婪)匹配 “a123b456b” 中的 “a123b456b”;"a.*?b"(懒惰)只匹配 “a123b”。
3. 字符类元字符(简写形式)
这些是预定义的字符集合,等价于 [...]
| 元字符 | 等价于 | 含义 |
|---|---|---|
\d | [0-9] | 匹配一个数字 |
\D | [^0-9] | 匹配一个非数字 |
\w | [A-Za-z0-9_] | 匹配一个单词字符(字母、数字、下划线) |
\W | [^A-Za-z0-9_] | 匹配一个非单词字符 |
\s | [ \t\r\n\f] | 匹配一个空白字符(空格、Tab、换行等) |
\S | 非 \s | 匹配一个非空白字符 |
4. 边界元字符
| 元字符 | 含义 | 示例 | 说明 |
|---|---|---|---|
\b | 单词边界(单词与非单词字符之间) | \bcat\b | 匹配独立单词 “cat”,不匹配 “concat” 中的 cat |
\B | 非单词边界 | \Bcat\B | 匹配 “concat” 中的 “cat” |
5. 分组与选择元字符
| 元字符 | 含义 | 示例 |
|---|---|---|
() | 捕获分组(同时分组并记住匹配内容) | (ab)+ 匹配 “ab”、”abab” 并捕获 |
(?:) | 非捕获分组(只分组,不记住) | (?:ab)+ 同上但不创建捕获组 |
| | 或(选择分支) | cat|dog 匹配 “cat” 或 “dog” |
6. 零宽断言(高级,看断言,不消耗字符)
| 元字符 | 含义 | 示例 |
|---|---|---|
(?=pattern) | 正向前瞻:后面必须跟 pattern | a(?=\d) 匹配后面是数字的 “a” |
(?!pattern) | 负向前瞻:后面不能跟 pattern | \d+(?!px) 匹配不以 px 结尾的数字 |
(?<=pattern) | 正向后瞻:前面必须是 pattern | (?<=¥)\d+ 匹配前面是 ¥ 的数字 |
(?<!pattern) | 负向后瞻:前面不能是 pattern | (?<!¥)\d+ 匹配前面不是 ¥ 的数字 |
7. 其他元字符
| 元字符 | 含义 |
|---|---|
[] | 字符集合(内部可包含范围、否定等) |
[^] | 否定字符集合 |
转义规则提醒
当你需要匹配这些元字符本身时,必须用 \ 转义:
\.、\*、\+、\$、^、\|、\(``\)、\[``\]、\{``\}、\\等。
小结:元字符记忆口诀
- 位置:
^ $ \b \B - 数量:
* + ? {n,m} - 任意:
. - 类型:
\d \D \w \W \s \S - 选择分组:
| () (?:) - 断言:
(?=) (?! ) (?<=) (?<!)
这些元字符组合起来,就能构造出几乎所有复杂的匹配模式。建议在 regex101.com 上边看边练,很快就能熟练!
如果你想看某个元字符的更多实际例子,或者对比练习,随时说!