Chapter 02 / 10

字符类与边界匹配

掌握字符类、预定义类与位置锚定——正则表达式的精确定位工具

字符类(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:]小写字母

小结