A. 痛点描述(Problem)#
正则最难的部分往往不是“会不会写”,而是:
- 你不知道某个场景里“足够好”的模板长什么样
- 你不知道边界条件(例如国际手机号、URL 的各种合法字符、日期闰年)
- 你更不知道把模板搬进代码后,是否与当前语言/引擎兼容
这篇文章把工程里最常见的模板按“能直接用”的标准整理出来:每个模板都说明适用范围与坑位,并建议你先在线验证再落地。
工具入口:正则表达式测试
👉 立即使用:正则表达式测试
B. 使用建议(先看这 3 条,少踩 80% 的坑)#
1)区分“校验”与“提取”#
- 校验:判断整段字符串是否符合格式 → 优先
^...$锚定 - 提取:从文本中找出若干片段 → 常用
g全局匹配
同一个模式不一定两用。校验如果不加 ^...$,经常会把“包含合法片段”的字符串误判为合法。
2)不要试图用一个正则覆盖所有世界#
例如邮箱、URL、日期这些格式在标准上非常复杂,工程上通常追求“对我们的输入足够稳”,而不是“对所有 RFC 都完美”。
3)先用工具跑出来“分组与位置”,再写进代码#
在工具里你能看到每条命中的 index/end、分组 $1 $2 ...、命名组,这比肉眼判断准确得多。
C. 常用模板(可复制)#
说明:下列模板以 JavaScript
RegExp语义为准。跨语言(尤其 Go/Java)请以“工具 → 代码生成”导出对应语言示例为准。
1)邮箱(工程常用版)#
- 校验(相对宽松、足够工程使用):
^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
- 提取(从文本中找邮箱,配合
g):[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}
常见坑:
- 域名可能有多级:
a.b.c,因此\.\w+不够 - 用户名里常见
+(邮箱别名),模板应支持
2)手机号(中国大陆常见场景)#
- 仅校验 11 位手机(不含分隔符):
^1[3-9]\d{9}$
- 从文本提取手机号(允许空格/短横线分隔):
1[3-9]\d(?:[-\s]?\d){8}
常见坑:
- 带区号/国际号码不是这个规则,别强行套用
- 业务里如果允许
+86,建议先做前置清洗再校验
3)URL(HTTP/HTTPS,工程实用版)#
- 校验(更偏工程可用,不追求 RFC 完整):
^https?:\/\/[^\s/$.?#].[^\s]*$
- 提取(从文本中找 URL):
https?:\/\/[^\s]+
常见坑:
- URL 合法字符非常多,越“严格”的正则越容易误杀真实 URL
- 工程上通常“宁可宽松提取,再用 URL 解析器二次校验”
4)IPv4#
- 严格校验(0-255 每段):
^(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)$
常见坑:
^\d{1,3}(\.\d{1,3}){3}$太宽松,会把999.999.999.999当成合法
5)日期(YYYY-MM-DD,含月份/日期范围)#
- 校验(不处理闰年细节,但会约束 01-12 月与 01-31 日):
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
常见坑:
- 是否允许
/分隔、是否允许单数字月日(2026-5-8)需要明确 - 闰年与每月天数差异,用正则硬做会非常复杂;工程上常用“正则粗校验 + 日期库精校验”
6)时间(HH:mm:ss)#
- 24 小时制校验:
^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$
7)十六进制(颜色值 / hash 片段)#
- Hex 颜色(#RGB / #RRGGBB):
^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$
- 32 位 hex(常见 hash):
^[0-9a-fA-F]{32}$
8)日志提取:从一行里抓字段#
示例文本:
2026-05-08 10:23:11 INFO order-service trace_id=abc123 cost=12ms user=42
提取 key=value(简化版):
(\w+)=([^\s]+)
配合 g 全局匹配后,你能得到两列分组:
$1:key$2:value
如果 value 里可能包含空格(如引号包裹),建议升级为:
(\w+)=(?:"([^"]*)"|([^\s]+))
然后用分组判断是 $2 还是 $3 命中。
D. 在工具里怎么验证(推荐流程)#
- 把模板粘贴进“正则表达式”,按需求选择
g/i/m/s/u等 flags - 把样例文本粘贴到“测试文本”,确认命中数量与命中内容
- 看“匹配结果表格”的分组列,确认每个字段是否被正确捕获
- 如需清洗,写替换模板并看“替换预览”
- 点“代码生成”,把模板变成可运行代码落地到项目
E. 常见问题(FAQ)#
1)要不要追求“一个正则适配全世界”?#
一般不建议。你应该先定义“输入来源与边界”,再写一个对这个边界足够稳的模板。
2)为什么模板在工具里能用,放到代码里不行?#
常见原因是“字符串字面量二次转义”。例如在 JS 字符串里写 \d,你需要 "\\d"。建议直接用“代码生成”导出,避免手写转义出错。
工具推荐#
- 正则表达式测试(匹配/替换/分组/代码生成):立即使用:正则表达式测试
