什么是正则表达式
正则表达式(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"
小结
- 普通字符匹配自身;元字符有特殊含义,需要
\转义才能匹配字面量 - 量词
* + ? {n,m}控制前一元素的重复次数 - 点号
.匹配任意字符(默认不含换行) |是低优先级的"或";用()分组可以限制作用范围