写给普通人的正则表达式实用指南
正则表达式(regex)有一个口碑问题。它们看起来像有人趴在键盘上打了一串:^[\w.-]+@[\w-]+\.[\w.]+$。它们出现在代码审查、文本编辑器、搜索工具和表单验证中。开发者要么热爱它们,要么完全回避它们。
真相介于两者之间。正则表达式确实强大。初看也确实令人困惑。但你不需要掌握每一个晦涩的功能才能获得实用价值。几个模式就能覆盖绝大多数实际使用场景。
正则表达式实际做什么
正则表达式是描述一组字符串的模式。你把它交给搜索工具,它会找到所有匹配该模式的字符串。把它想象成一个非常精确的搜索查询。
普通搜索:精确查找"hello" 正则搜索:查找任何看起来像邮箱地址、电话号码、日期、URL或你能描述的任何其他模式的东西。
你知道吗? 正则表达式由数学家Stephen Kleene于1956年发明,作为描述形式语言理论中"正则语言"的符号。它们通过1960年代和1970年代早期的Unix文本编辑器进入了计算领域。
基础构建块
字面字符
最简单的正则表达式就是字面文本。模式hello匹配字符串"hello"。没有花哨的东西。
点号(.)——任意单个字符
点号匹配任意单个字符(换行符除外)。
h.t匹配"hat"、"hit"、"hot"、"hut",甚至"h3t"
字符类([])——特定字符
方括号定义该位置允许的字符集合。
[aeiou]匹配任意单个元音字母[0-9]匹配任意数字[A-Za-z]匹配任意字母(大写或小写)[^0-9]匹配任意非数字字符(方括号内的^表示"非")
量词——多少个
这些符号控制重复:
| 符号 | 含义 | 示例 | 匹配 |
|---|---|---|---|
* |
零个或多个 | ab*c |
"ac"、"abc"、"abbc"、"abbbc" |
+ |
一个或多个 | ab+c |
"abc"、"abbc"、"abbbc"(不匹配"ac") |
? |
零个或一个 | colou?r |
"color"和"colour" |
{3} |
恰好3个 | a{3} |
"aaa" |
{2,4} |
2到4个 | a{2,4} |
"aa"、"aaa"、"aaaa" |
锚点——位置
^在开头表示"字符串的开始"$在结尾表示"字符串的结束"^hello$只匹配精确字符串"hello",不匹配"say hello"或"hello world"
简写类
常见字符类有快捷方式:
| 简写 | 等效 | 含义 |
|---|---|---|
\d |
[0-9] |
任意数字 |
\w |
[A-Za-z0-9_] |
任意"单词"字符 |
\s |
[ \t\n\r] |
任意空白字符 |
\D |
[^0-9] |
任意非数字 |
\W |
[^A-Za-z0-9_] |
任意非单词字符 |
\S |
[^ \t\n\r] |
任意非空白 |
分组(())——组合和捕获
圆括号将模式的部分组合在一起。这对于对组应用量词或提取匹配的特定部分很有用。
(ab)+匹配"ab"、"abab"、"ababab"(\d{3})-(\d{4})匹配"555-1234"并分别捕获"555"和"1234"
管道符(|)——或
管道符表示"或"。
cat|dog匹配"cat"或"dog"(jpg|png|gif)匹配这三个图片扩展名中的任何一个
你今天就能使用的实用模式
匹配邮箱地址(简单版)
[\w.-]+@[\w-]+\.[\w.]+
分解:
[\w.-]+— 一个或多个单词字符、点或连字符(本地部分)@— 字面上的@符号[\w-]+— 一个或多个单词字符或连字符(域名)\.— 字面上的点(转义因为.是特殊字符)[\w.]+— 一个或多个单词字符或点(顶级域名)
警告 用正则表达式验证邮箱是出了名的难以做到完美。上面的简单模式覆盖了99%的实际邮箱地址,但不处理RFC规范中定义的每一个边缘情况。对于生产环境的验证,请使用你编程语言的邮箱验证库。
匹配电话号码(中国格式)
1[3-9]\d{9}
这匹配中国手机号码格式如:13812345678。
匹配URL
https?://[\w.-]+(/[\w./-]*)?
这匹配:
匹配日期(YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
这匹配:2026-03-23、1999-12-31等。
查找重复单词
\b(\w+)\s+\1\b
这匹配像"the the"或"is is"这样的重复单词。\1回引第一个组捕获的内容。
匹配IPv4地址
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
这匹配像192.168.1.1或10.0.0.255这样的模式。
编写正则表达式的技巧
1. 从简单开始,然后逐步改进
不要试图第一次就写出完美的正则表达式。从宽泛的模式开始,用你的数据测试,然后收紧。
2. 始终测试
正则表达式很容易出错。缺少一个量词或一个未转义的点可以完全改变匹配的内容。始终用真实数据测试你的模式。
3. 转义特殊字符
如果你需要匹配字面上的点、圆括号、方括号或其他特殊字符,用反斜杠转义:\.、\(、\[。
4. 使用注释和命名组
在复杂模式中,使用命名组和注释(在支持的地方)使正则表达式可读。未来的你会感谢的。
5. 知道何时不使用正则表达式
正则表达式不适合解析HTML、XML、JSON或任何嵌套结构。对这些使用适当的解析器。
提示 实时测试和调试你的正则表达式模式:如何测试正则表达式模式。粘贴你的模式和测试数据,即时看到匹配高亮。
现在就开始测试正则表达式:
免费,即时反馈,无需注册。