正则表达式(Regular Expressions)入门与实践
正则表达式是一种用来匹配字符串的强大语法规则集合,广泛应用于文本搜索、数据清洗、日志分析及 Web 开发等场景。
文章目录
什么是正则表达式
正则表达式(Regular Expression,简称 regex 或 regexp)是一种描述字符模式的语法,用于在文本中搜索、提取、替换符合特定模式的子串。几乎所有现代编程语言(如 Python、JavaScript、Java、Go)及命令行工具(如 grep
、sed
)都内置或支持正则引擎。
基本语法元素
元字符 | 说明 | 示例 | ||
---|---|---|---|---|
. | 匹配除换行符以外的任意单个字符 | a.c 可匹配 abc 、axc | ||
\\ | 转义下一个字符 | \\. 仅匹配句点本身 | ||
* | 匹配前一个表达式 0 次或多次 | lo*l 可匹配 ll 、lol 、lool | ||
+ | 匹配前一个表达式 1 次或多次 | lo+l 可匹配 lol 、lool | ||
? | 匹配前一个表达式 0 次或 1 次;在量词后表示非贪婪模式 | colou?r 可匹配 color 、colour | ||
` | ` | 逻辑“或” | `cat | dog可匹配 cat或 dog` |
() | 分组与捕获 | (abc)+ 重复匹配 abc 片段 | ||
[] | 定义字符集合 | [A-Z] 匹配任一大写字母 |
字符集合与转义
-
范围:
[0-9]
表示任意数字。 -
排除:
[^aeiou]
匹配任何非元音字符。 -
简写字符类(以 PCRE/JavaScript 语法为例):
\\d
↔[0-9]
(数字)\\w
↔[A-Za-z0-9_]
(单词字符)\\s
↔ 空白字符(含空格、制表符、换行)- 对应的大写如
\\D
、\\W
、\\S
表示取反
提示:在字符类
[]
内只有-
,^
,]
,\\
需要转义;在类外,诸多元字符(如.
、*
、?
、+
)均须转义才能表达字面含义。
量词 (Quantifiers)
语法 | 描述 | 贪婪 vs. 非贪婪 |
---|---|---|
* | 0 次或多次 | .* vs. .*? |
+ | 1 次或多次 | .+ vs. .+? |
? | 0 或 1 次 | .? vs. .? |
{n} | 恰好 n 次 | \\d{4} 匹配四位数字年份 |
{n,} | 至少 n 次 | \\d{2,} 匹配 2 位以上数字 |
{n,m} | n–m 次 | \\d{1,3} 匹配 1–3 位数字 |
锚点 (Anchors)
^
:匹配字符串开始$
:匹配字符串结束\\b
:单词边界;\\B
:非单词边界
示例:
^\\d{4}-\\d{2}-\\d{2}$
匹配完整的 ISO 日期格式 YYYY-MM-DD
。
分组与引用
- 捕获组:
()
, 可通过\\1
,\\2
引用 - 非捕获组:
(?:...)
, 减少内存开销 - 命名组(部分语言支持):
(?P<year>\\d{4})
示例(Python):
import re
pattern = re.compile(r"(\\b\\w+) \\1")
print(pattern.findall("bye bye see you")) # ['bye']
常见示例
# 1. 邮箱地址(简化版)
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$
# 2. IPv4
^(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)(?:\\.(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)){3}$
# 3. 中国手机号
^1[3-9]\\d{9}$
高级特性
- 前瞻/后顾(Lookahead/Lookbehind):
(?=...)
,(?!...)
,(?<=...)
,(?<!...)
- 条件判断:
(?(<name>)yes|no)
(PCRE) - 嵌入式修饰符:
(?i)
大小写不敏感 - Unicode 属性:
\\p{Han}
匹配中文字符
常用工具与资源
工具/网站 | 用途 |
---|---|
regex101 | 交互式调试,支持多种方言 |
RegExr | 可视化解释与社区示例 |
grep , sed , awk | Unix 文本处理三剑客 |
ripgrep | Rust 实现的极速搜索 |
VSCode / Sublime Text | 编辑器自带正则搜索替换 |
参考资料
- Jeffrey Friedl. Mastering Regular Expressions, 3rd ed., O’Reilly Media, 2006.
- Russ Cox. Regular Expression Matching Can Be Simple And Fast (but is slow in Java, Perl, PHP, Python, Ruby, …), 2010.
- Python
re
官方文档:https://docs.python.org/3/library/re.html - MDN Web Docs: Regular expressions.