Chapter 01 / 10

正则表达式基础
字符与量词

从最简单的字面量匹配开始,理解元字符与量词的精确语义

什么是正则表达式

正则表达式(Regular Expression)是描述字符串模式的一种微型语言。给定一个模式和一段文本,正则引擎会扫描文本,找出所有与模式匹配的子串。

INFO正则表达式并不是某个编程语言的功能,而是一个独立的语言规范。Python、JavaScript、Java、Go、grep、sed 等工具都实现了各自的正则引擎,但核心语法高度兼容(主要方言:PCRE、ECMAScript、RE2)。

字面量字符

最简单的正则就是普通字符,它们匹配自身:

/hello/
say hello to the world, say hello again
↑ 默认只匹配第一个(非全局模式)

加上 g(全局)标志后,找到所有匹配:

/hello/g
say hello to the world, say hello again

元字符(Meta Characters)

某些字符在正则中有特殊含义,称为元字符。它们不再匹配自身:

元字符含义示例
.匹配任意单个字符(换行符除外)a.c 匹配 "abc"、"axc"
*前一元素出现 0 次或多次ab*c 匹配 "ac"、"abc"、"abbc"
+前一元素出现 1 次或多次ab+c 匹配 "abc"、"abbc",不匹配 "ac"
?前一元素出现 0 次或 1 次colou?r 匹配 "color"、"colour"
^字符串(或行)的起始^Hello 仅匹配行首的 Hello
$字符串(或行)的结尾world$ 仅匹配行尾的 world
|逻辑或(选择)cat|dog 匹配 "cat" 或 "dog"
( )分组(ab)+ 匹配 "ab"、"abab"
[ ]字符类[aeiou] 匹配任一元音
{ }精确量词a{3} 匹配 "aaa"
\转义下一字符\. 匹配字面量点号

转义(Escaping)

如果想匹配元字符本身,需要用反斜杠 \ 转义:

# 匹配价格 $3.99
\$\d+\.\d{2}

# 匹配括号 (text)
\(.*?\)
WARNING在 Python 字符串中写正则时,建议使用原始字符串 r"...",避免双重转义。例如 r"\d+""\\d+" 更清晰。

量词(Quantifiers)

量词控制前一元素重复出现的次数:

量词含义等价
*0 次或多次{0,}
+1 次或多次{1,}
?0 次或 1 次{0,1}
{n}恰好 n 次
{n,}至少 n 次
{n,m}n 到 m 次(含两端)

精确量词示例

/\d{4}-\d{2}-\d{2}/
今天是 2026-03-26,明天是 2026-03-27
匹配 YYYY-MM-DD 格式的日期

量词作用于分组

量词可以作用于分组,而不只是单个字符:

(ha){3}   # 匹配 "hahaha"
(\d{1,3}\.){3}\d{1,3}  # 简单 IPv4 模式

点号(.)的行为

点号 . 匹配除换行符 \n 之外的任意字符。要让它匹配换行符,需要开启 DOTALL 标志(Python 中 re.DOTALL,JavaScript 中 s 标志)。

/c.t/g
cat cut c@t ct c t
"ct" 不匹配(. 需要恰好 1 个字符);"c t" 也不匹配

选择(Alternation)

管道符 | 表示"或",优先级很低——它作用于两边的整个表达式:

grey|gray       # 匹配 "grey" 或 "gray"
gr(e|a)y        # 同上,但用分组限制范围
cat|dog food    # 匹配 "cat" 或 "dog food"(不是 "cat food")
(cat|dog) food  # 匹配 "cat food" 或 "dog food"

小结