正则表达式元字符详解
元字符 (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)+ 同上但不创建捕获组 |
| ` | ` | 或(选择分支) |
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 上边看边练,很快就能熟练!
如果你想看某个元字符的更多实际例子,或者对比练习,随时说!