字符类(Character Class)
方括号 [] 定义一个字符类,表示"匹配其中任意一个字符":
[aeiou] # 匹配任意一个元音字母 [0-9] # 匹配任意数字(范围语法) [a-z] # 匹配任意小写字母 [A-Za-z0-9] # 匹配字母或数字 [+-] # 匹配 + 或 -(字符类内 - 在首/末位时为字面量)
WARNING字符类内部,大多数元字符失去特殊含义。
[.] 匹配字面量点,[(] 匹配字面量括号。只有 ]、\、^(在首位)、-(在中间)仍有特殊含义。取反字符类
^ 出现在字符类的第一位时表示取反,匹配"不在其中"的字符:
/[^aeiou]/g
hello
等等……其实取反匹配的是辅音:hello 中 h、l、l 被匹配
[^0-9] # 匹配任意非数字字符 [^\r\n] # 匹配非换行字符(类似 . 但含制表符)
预定义字符类
常用的字符类有预定义的简写形式:
| 简写 | 等价字符类 | 含义 |
|---|---|---|
| \d | [0-9] | 数字 |
| \D | [^0-9] | 非数字 |
| \w | [A-Za-z0-9_] | 单词字符(字母、数字、下划线) |
| \W | [^A-Za-z0-9_] | 非单词字符 |
| \s | [ \t\r\n\f\v] | 空白字符(空格、制表符、换行等) |
| \S | [^ \t\r\n\f\v] | 非空白字符 |
/\d{3}-\d{4}/g
电话:138-8888,备用:139-9999
组合预定义类
\w+@\w+\.\w+ # 简单邮箱模式 \s+ # 一个或多个空白(常用于切分单词) \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} # 简单 IPv4
边界锚定(Anchors)
锚定符不匹配任何字符,而是匹配字符串中的某个位置:
| 锚定符 | 匹配的位置 |
|---|---|
| ^ | 字符串(或行)的起始位置 |
| $ | 字符串(或行)的结束位置 |
| \b | 单词边界(\w 和 \W 之间的位置) |
| \B | 非单词边界 |
| \A | 字符串的起始(不受多行模式影响,Python 专用) |
| \Z | 字符串的结尾(不受多行模式影响,Python 专用) |
^ 和 $ 示例
/^\d{4}$/
匹配:2026 不匹配:12345、 2026
整行必须恰好是 4 位数字
单词边界 \b
\b 匹配"单词字符"与"非单词字符"之间的边界(包括字符串边缘):
/\bcat\b/g
a cat sat on the caterpillar
"caterpillar" 中的 "cat" 不匹配,因为后面紧跟字母
TIP
\b 非常适合用来匹配完整单词,避免误匹配到更长单词的子串。比如 \bword\b 只匹配独立的 "word",而不匹配 "keyword" 中的 "word"。Unicode 与字符类
在现代正则引擎中,\w 和 \d 默认只匹配 ASCII 范围。要匹配 Unicode 字符(如中文、日文),需要:
# Python:re.UNICODE 标志(Python 3 默认已开启) import re re.findall(r'\w+', 'hello 世界') # → ['hello', '世界'] (Python 3 默认支持 Unicode \w) # JavaScript:ES2018 Unicode 模式 /\p{L}+/gu # \p{L} 匹配任意 Unicode 字母
POSIX 字符类(Perl/PCRE)
在方括号内可以使用 POSIX 类(部分引擎支持):
| POSIX 类 | 含义 |
|---|---|
| [:alpha:] | 字母([A-Za-z]) |
| [:digit:] | 数字([0-9]) |
| [:alnum:] | 字母或数字 |
| [:space:] | 空白字符 |
| [:upper:] | 大写字母 |
| [:lower:] | 小写字母 |
小结
- 字符类
[abc]匹配其中任一字符;[^abc]取反匹配 - 范围写法
[a-z]、[0-9]简洁高效 - 预定义类
\d \w \s及其大写取反形式是最常用的简写 - 锚定符
^ $匹配位置而非字符;\b是单词边界