正则表达式入门:Regex 测试完全指南
正则表达式(Regular Expression,简称 Regex)是文本处理的瑞士军刀。从验证表单输入到搜索日志文件,从提取数据到批量替换,正则表达式用简洁的语法完成复杂的文本匹配任务。但它的语法也以”难以阅读”著称——有人戏称正则表达式是”只写语言”。这篇指南将帮助你从零开始理解正则表达式,并学会高效地测试和调试。
正则表达式基础
正则表达式本质上是一种描述文本模式的小型语言。你用特定的语法定义一个模式,正则引擎在目标文本中搜索匹配该模式的内容。
元字符
元字符是正则表达式中具有特殊含义的字符。要匹配元字符本身,需要用反斜杠转义。
.— 匹配除换行符外的任意字符\d— 匹配数字,等价于[0-9]\w— 匹配字母、数字或下划线,等价于[a-zA-Z0-9_]\s— 匹配空白字符(空格、制表符、换行等)^— 匹配字符串开头$— 匹配字符串结尾\b— 匹配单词边界
对应的大写版本表示取反:\D 匹配非数字,\W 匹配非单词字符,\S 匹配非空白字符。
量词
量词指定前一个元素重复的次数:
*— 0 次或多次(如go*匹配 “g”、“go”、“goo”)+— 1 次或多次(如go+匹配 “go”、“goo”,不匹配 “g”)?— 0 次或 1 次(如colou?r同时匹配 “color” 和 “colour”){n}— 恰好 n 次{n,}— 至少 n 次{n,m}— n 到 m 次
量词默认是贪婪的——会尽可能多地匹配。在量词后加 ? 变为懒惰模式,尽可能少地匹配。例如 a.*b 在 “a1b2b3b” 中匹配 “a1b2b3b”,而 a.*?b 只匹配 “a1b”。
分组和捕获
(abc)— 捕获组,匹配 “abc” 并记住匹配内容(?:abc)— 非捕获组,匹配但不记住a|b— 或,匹配 “a” 或 “b”[abc]— 字符类,匹配 “a”、“b” 或 “c” 中的任一个[^abc]— 否定字符类,匹配除 “a”、“b”、“c” 外的任一字符
捕获组的内容可以通过反向引用在表达式中使用:\1 引用第一个捕获组,\2 引用第二个,以此类推。
常见匹配模式
邮箱地址
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
这个模式匹配大多数常见邮箱格式。注意:完整的 RFC 5322 邮箱验证正则极其复杂,实际开发中通常用简化版本配合后端验证。
URL
https?:\/\/[\w\-]+(\.[\w\-]+)+[/#?]?.*
匹配以 http:// 或 https:// 开头的 URL。对于严格的 URL 解析,建议使用编程语言内置的 URL 解析库。
手机号码(中国大陆)
^1[3-9]\d{9}$
匹配以 1 开头、第二位为 3-9、共 11 位数字的中国大陆手机号。
身份证号(18 位)
^\d{17}[\dXx]$
匹配 18 位身份证号,最后一位可能是数字或 X。
标志位
正则表达式的标志位改变匹配的行为:
- g(全局):查找所有匹配,而非在第一个匹配后停止
- i(忽略大小写):不区分大小写匹配
- m(多行):使
^和$匹配每行的开头和结尾,而非整个字符串 - s(点号匹配换行):使
.匹配包括换行符在内的所有字符
标志位可以组合使用。例如 /pattern/gi 同时启用全局和忽略大小写。
正则测试策略
写正则表达式时,最常见的问题是”看起来对但实际不匹配”或”匹配了不该匹配的内容”。以下是高效测试的方法:
从简单开始
不要一开始就写完整的复杂模式。先匹配最核心的部分,确认有效后再逐步添加约束。例如验证邮箱时,先确保能匹配 @,再加前缀和域名规则。
测试边界情况
- 空字符串
- 刚好满足和不满足条件的输入
- 包含特殊字符的输入
- 超长输入
使用可视化工具
正则表达式的可读性很差。使用可视化工具将正则表达式渲染为铁路图,可以直观理解匹配逻辑。测试工具通常会高亮匹配的部分,让你立即看到哪些文本被匹配。
注意性能
某些正则表达式可能导致灾难性回溯(ReDoS)。例如 (a+)+b 在不匹配的长字符串上会导致指数级的时间消耗。避免嵌套量词和重叠的替代分支。
使用 TextKit 的正则测试工具
TextKit 提供免费的 正则测试工具,让测试正则表达式变得简单:
- 在正则表达式输入框中输入你的模式
- 在测试文本区域输入待匹配的文本
- 工具实时高亮所有匹配结果
- 支持切换标志位(g、i、m)
- 显示捕获组内容
- 一键复制正则表达式
所有匹配过程在浏览器中完成,无需安装任何软件。
正则表达式学习建议
- 从实际需求出发:不要试图一次学完所有语法,遇到具体问题时学习对应的语法。
- 多写多测:正则表达式是技能,不是知识。只有通过反复练习才能熟练。
- 添加注释:在复杂正则中使用
(?#注释)或拆分为多行,帮助未来的自己理解。 - 知道何时不用正则:有些任务用字符串方法更简单清晰。正则不是万能的。
准备好测试你的正则表达式了吗?试试 TextKit 免费的 正则测试工具——输入模式,实时查看匹配结果。