正则表达式参考
浏览 30 多个常用正则表达式模式和语法标记,附带示例。
大多数开发者并不需要从零编写正则表达式——他们需要的是一份已经能用的模式。这份正则速查表收录了 30 个开箱即用的表达式,外加一份 24 条目的语法符号指南,说明这些表达式由哪些符号构成。每张模式卡片都附原始正则、说明和一个匹配示例,让你无需猜测即可复制、测试和改写。
这份参考包含什么
模式库按用途而非语法组织。
| 分类 | 数量 | 示例 |
|---|---|---|
| 验证 | 12 | 邮箱、URL、IPv4、电话、ISO 日期、时间、强密码、美国 ZIP、信用卡、SSN、用户名、IPv6 |
| Web | 5 | 十六进制颜色、含内容的 HTML 标签、CSS rgb()、MD5 哈希、SHA-256 哈希 |
| 数字 | 5 | 整数、小数、百分比、美元金额、科学计数法 |
| 格式 | 5 | slug、camelCase、PascalCase、snake_case、kebab-case |
| 字符串 | 3 | 去除空白、重复词、文件扩展名 |
合计 30 个模式。语法指南另加 24 个符号,分七个类别:锚点、量词、字符集、分组、字符转义、分支和环视。
模式分类详解
验证类最大,因为表单校验是人们求助正则最常见的原因。IPv4 模式是精心构造的好例子:它不是把 \d{1,3} 重复四次,而是把每个八位组约束在 0-255,因此 192.168.1.1 通过,192.168.1.999 失败。密码模式使用四个正向前瞻分别要求一个小写字母、一个大写字母、一个数字和一个符号,再从合并字符集中匹配至少 8 个字符。
Web类提取或校验出现在标记和样式表中的值:3 位或 6 位十六进制颜色、通过反向引用匹配闭合标签的 HTML 标签、rgb() 函数,以及 MD5 与 SHA-256 摘要固定的 32、64 字符形态。
数字类覆盖带符号整数、小数、百分比、千位分隔的美元金额,以及 6.022e23 这样的科学计数法。
格式类测试标识符风格——my-blog-post、myVariableName、MyClassName、my_variable_name、my-css-class——对 lint 规则和命名约定很有用。
字符串类补全整套:首尾空白、连续重复词(\b(\w+)\s+\1\b)和尾部文件扩展名。
语法符号按类别讲解
符号表是本页的教学部分。锚点(^、$、\b、\B)把匹配固定到某个位置。量词(*、+、?、{n}、{n,}、{n,m})控制重复次数。字符集([abc]、[^abc]、.)定义单个位置可容纳什么。分组((...)、(?:...)、\1)捕获或复用文本。转义(\d、\w、\s 及其否定 \D、\W、\S)是简写字符类。分支(|)在多个表达式间选择,(?=...) 是正向前瞻,断言后面是什么却不消费它。
实操示例:拆解 URL 模式
URL 条目存储为:
^https?://[\w.-]+(:\d+)?(/[\w./%+-]*)?(\?[\w%&=.-]*)?(#\w*)?$
逐段拆解。^https?:// 要求 http:// 或 https://。[\w.-]+ 匹配由单词字符、点和连字符组成的主机名。(:\d+)? 接受可选端口。(/[\w./%+-]*)? 接受可选路径。(\?[\w%&=.-]*)? 和 (#\w*)? 允许查询串和片段。因为每个可选分组都以 ? 结尾,https://example.com 即便没有路径也能匹配。它不会匹配裸 example.com、ftp:// 这类协议,或包含集合外字符的路径——对一个短小易读的模式来说都是合理的取舍,但上线前你应当了解这些限制。
实操示例:邮箱模式接受哪些输入
邮箱条目是:
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
从左往右读。^ 把匹配锚定在开头。[a-zA-Z0-9._%+-]+ 为本地部分消费一个或多个字母、数字、点、下划线、百分号、加号或连字符。@ 是字面量 at 符号。[a-zA-Z0-9.-]+ 取域名。\. 是字面量点,[a-zA-Z]{2,} 要求顶级域至少有两个字母。$ 锚定结尾。
应用于示例输入:
| 输入 | 结果 | 原因 |
|---|---|---|
user@example.com | 匹配 | 简单本地部分,两字母 TLD |
first.last+tag@mail.co.uk | 匹配 | 点和加号属于本地字符集;最终点后 TLD 有两个字母 |
user@example | 拒绝 | 缺少点加字母的后缀 |
"user name"@example.com | 拒绝 | 空格和引号不在本地字符类中 |
user@exa mple.com | 拒绝 | 域名字符类不含空格 |
最后两条对比才是重要的教训。拒绝空格是正确的,但拒绝带引号的本地部分是该简化模式的局限,而非邮箱本身的限制。若需要 RFC 级别的接受度,请把这个正则与确认邮件配合使用,而不要单独信任该模式。
内置模式的已知局限
这些模式是起点,不是权威。邮箱和 URL 条目刻意宽松,以避免拒绝合法输入;严格的 RFC 5322 邮箱校验器要长得多且仍不完美,这也是为什么发送确认邮件才是真正的测试。如果把这些分组嵌套进其他量词,就有灾难性回溯的风险,因此任何改写后的模式都要用恶意输入测试。最后,各引擎并不一致:后行断言、命名分组和 Unicode 属性转义在 JavaScript、Python 与 Go 中表现不同,同一字符串可能在一个运行时匹配、在另一个失败。复制来的模式一定要在它实际执行的环境中跑一遍。
相关工具
常见问题
参考里有多少个模式,是怎么分组的?
恰好 30 个模式,分五类:验证 12 个(邮箱、URL、IPv4、电话、日期、时间、密码、ZIP、信用卡、SSN、用户名、IPv6),Web 5 个,数字 5 个,格式 5 个,字符串 3 个。每张模式卡片包含名称、表达式本身、说明和一个匹配示例。
参考里哪些模式只是近似而非严格校验器?
邮箱、URL 和密码模式是有意宽松的。邮箱模式拒绝 "user name"@example.com 这种带引号的本地部分,也不强制 254 字符上限;URL 模式要求 http 或 https 协议,且遗漏许多合法字符。请把它们当作首轮过滤,再用解析器或更严格的检查确认。
为什么 IPv4 模式不接受 999.1.1.1?
每个八位组由三种分支构成——25 后跟 0-5、2 后跟 0-4 再接任意数字,或可选的 0/1 再接一到两位数字——从而把每个八位组限制在 255。这也解释了为什么它拒绝 001.2.3.4 这类前导零形式:第一种分支只在 25x 时触发。
这些模式包含 g 或 i 之类的标志吗?
不包含。模式以裸表达式字符串存储。需要区分大小写时在模式内部处理——例如十六进制颜色同时接受 a-f 和 A-F。把模式粘贴到 JavaScript 时,再按需加上标志,如 i 表示不区分大小写、g 表示全局扫描。
每张模式卡片实际展示什么?
四样东西:模式名称、可复制的代码块中的原始正则、对匹配内容的通俗说明,以及一个能被它接受的示例字符串。示例只作说明,不是测试运行器;要看实时匹配分组和标志,请使用关联的正则测试器。
符号指南包含后行断言和命名分组吗?
不包含。符号表有 24 个条目,分七类(锚点、量词、字符集、分组、转义、分支,以及一个前瞻断言)。正向后行断言、负向前瞻、命名捕获分组和懒惰量词都未收录,部分原因是各引擎支持不一。
由 HandyTools Hub 团队审校 · 最后更新