正则的三大实战场景
正则实际用起来就三类操作:
- 验证:判断文本是否符合格式(如邮箱、手机号)
- 提取:从文本中找出符合模式的内容(如所有 URL、所有金额)
- 替换:把符合模式的部分换成别的(如统一日期格式、脱敏手机号)
下面用实际案例演示。
验证类案例
验证手机号
正则:^1[3-9]\d{9}$
要点:用 ^ 和 $ 锚定首尾,确保整串是手机号而不是包含手机号的更长文本。第二位限定 3~9 是当前号段规则。
验证邮箱
正则:^[\w.-]+@[\w.-]+.\w+$
要点:简化版够用,严格邮箱正则非常复杂。实际项目用简化版 + 发验证邮件双重保证。
验证身份证
正则:^\d{17}[\dXx]$
要点:18 位,前 17 位数字,最后一位数字或 X。这个只验证格式,不验证校验码。
验证 URL
正则:^https?://[\w.-]+
要点:http 或 https 开头,接域名。简化版,完整 URL 正则极复杂。
提取类案例
提取所有手机号
正则:1[3-9]\d{9}
不用 ^ $,找出文本里所有手机号。用全局匹配(g 标志)。
提取所有 URL
正则:https?://[\w./?=&%-]+
匹配 http(s) 开头的 URL。实际 URL 字符更复杂,按需调整字符集。
提取所有金额
正则:[¥$]\d+(?:.\d+)?
匹配 ¥ 或 $ 开头的金额,小数可选。如 ¥100、$99.9。
提取 HTML 标签内容
正则:<a[^>]*>([^<]+)
提取 a 标签里的文字。括号分组捕获文字内容。注意这种正则处理 HTML 不够健壮,复杂 HTML 用解析器更稳。
替换类案例
手机号脱敏
把中间 4 位换成星号:1[3-9]\d{9} 替换成保留前 3 后 4。
实际用捕获分组:正则 (1[3-9]\d)\d{4}(\d{4}),替换成 1\1****\2。\1 和 \2 引用分组。
统一日期格式
把 2026/07/12 转成 2026-07-12:正则 (\d{4})/(\d{2})/(\d{2}),替换成 \1-\2-\3。
去除多余空格
把多个连续空格转成一个:正则 \s+,替换成单个空格。
删除 HTML 标签
去掉所有 HTML 标签只留文字:正则 <[^>]+>,替换成空。注意会丢掉标签属性里的 > 之类,复杂场景用解析器。
调试技巧
用测试工具逐步验证
用 正则测试工具:
- 输入正则
- 输入测试文本(含该匹配和不该匹配的样例)
- 看高亮匹配结果
- 逐步调整正则直到结果正确
先匹配再优化
先写一个能匹配的正则,再考虑优化(性能、精度)。别一上来追求完美。
用在线正则可视化
复杂正则用可视化工具拆解结构,理清每段含义。
注意边界情况
- 空字符串
- 只有部分匹配的字符串
- 含特殊字符的字符串
- 超长字符串
可复用的正则模式
中文
[\u4e00-\u9fa5]+
邮政编码
^\d{6}$
QQ 号
^[1-9]\d{4,10}$
十六进制颜色
^#[0-9a-fA-F]{6}$
版本号
^\d+.\d+.\d+$
常见坑
贪婪匹配
.* 会匹配过多。提取标签内容用 [^<]+ 而非 .*,避免跨标签匹配。
特殊字符未转义
匹配点、星、问号等元字符要转义。匹配反斜杠本身要写 \。
跨行匹配
默认 . 不匹配换行。处理多行文本要开启单行模式或用 [\s\S] 匹配任意字符。
性能问题
catastrophic backtracking(灾难性回溯):嵌套量词如 (a+)+ 在某些输入下极慢。复杂正则注意性能,超长文本先截断再匹配。
小结
正则实战分验证、提取、替换三类。验证用 ^ $ 锚定,提取用全局匹配,替换用捕获分组引用。写正则先用工具测试验证,再优化。记住几个常用模式(手机号、邮箱、日期、URL),日常够用。DocsAll 正则测试工具浏览器端运行,随写随测,文本不上传。