正则模式库,免费

60+ 个即用的正则模式。在线搜索、复制和测试。

关于此库

这是一个经过整理、可搜索的60+ 个常用正则表达式模式集合,按类别分组。每个模式都包含描述、表达式本身以及示例匹配。点击模式即可复制,或使用快速测试面板直接在此页面针对它校验文本。

一切都在您的浏览器中运行 · 模式或测试文本不会发送到任何地方。您可以在 JavaScript、Python、PHP、Java、Go 或任何支持正则的语言中使用这些模式。若需带标志和捕获组的更高级测试,请试试我们的 正则表达式测试器

工作原理

  1. 浏览或搜索:按类别(验证、提取、格式化)浏览模式,或按名称或用例搜索。
  2. 预览模式:每条记录都会显示正则表达式、对其匹配内容的描述、带匹配的示例输入以及限制。
  3. 用您的数据测试:输入您自己的测试字符串,验证模式是否能捕获您期望的内容。
  4. 复制使用:以 JavaScript、Python 或 POSIX 格式复制正则模式,用于您的代码。

为什么使用正则库?

从零开始编写正则表达式既耗时又容易出错。验证邮箱、匹配 URL、提取电话号码、检测信用卡、解析日期或验证 IP 地址等常见模式都有久经考验的解决方案 · 但找一个可靠版本通常需要在 Stack Overflow 上搜索、评估其正确性并检查边缘情况。此库将经过验证的模式与其记录的边缘情况、已知限制和具体测试用例集中在一起。这比自己写更快,比未经测试从互联网随机来源复制粘贴更可靠。

模式类别

正则表达式从何而来

「正则集」的数学概念由 斯蒂芬·科尔·克莱尼于 1951 年 在 RAND 研究备忘录 Representation of Events in Nerve Nets and Finite Automata 中形式化。本页上的 * 运算符至今仍以他的名字称为 克莱尼星号肯·汤普森 在他 1968 年 6 月的 Communications of the ACM 论文 Programming Techniques: Regular Expression Search Algorithm 中将理论转化为算法,并在贝尔实验室的 QED 编辑器中交付了第一个正则实现。到 1973 年,同一个引擎驱动了 ed,然后是 grep(字面展开为「globally search for regular expression and print」)、sedawk拉里·沃尔 的 Perl (1987) 特别是 Perl 5 (1994) 添加了命名组、环视、非贪婪量词和 Unicode 处理,这些成为了被称为 PCRE 的事实方言,菲利普·哈泽尔 在 1997 年将其移植到 C 作为库。

引擎方言及它们之间的变化

在 JavaScript 中干净运行的模式可能在 Go 中无声失败,在 POSIX 中直接被拒绝。开发者最可能遇到的五种方言:

灾难性回溯与 ReDoS

主流语言中的大多数正则引擎(PCRE、Java、JS V8 / SpiderMonkey / JavaScriptCore、Python re、.NET)是 回溯 引擎。当带有嵌套量词如 (a+)+ 的模式遇到几乎匹配的输入时,引擎可能在放弃前尝试指数级数量的替代路径。这就是 灾难性回溯,也是 OWASP 编目的 ReDoS(正则表达式拒绝服务)攻击类的基础。

Stack Overflow,2016 年 7 月 20 日:一个设计用于修剪前导和尾部空白的模式,应用于包含 20 000 个连续空白字符的问题正文,每个请求耗费 11 分钟 CPU,使网站 34 分钟无法访问。官方 Stack Status 博客上的事后分析建议用原生字符串 trim 替换修剪正则。

Cloudflare,2019 年 7 月 2 日:一条包含嵌套量词模式 .*(?:.*=.*) 的 WAF 规则被全球部署,使每个边缘服务器的 CPU 占用 27 分钟达到 100%,使大部分公共互联网下线。Cloudflare 在其博客上的事后分析将转向 Rust 的 regex crate(一个基于 RE2 的线性时间引擎)归功于防止重现。

防御性教训:避免嵌套量词((a+)+(a*)*(a|aa)+);避免对攻击者控制的输入使用 \s+$ 样式的修剪;在 PCRE 中优先使用原子组 (?>...) 或占有量词 a++;对于高吞吐量服务,考虑基于 RE2 的引擎。

邮箱、URL、电话、日期、信用卡:何时不应使用正则

邮箱。RFC 5322(2008 年 10 月)的完整语法编译为大约 3 000 个字符的正则。W3C 的 HTML5 规范用于 <input type="email"> 验证的正则要短得多:「这看起来合理像邮箱」,这是客户端提示的正确起点。RFC 6531(2012 年 2 月)允许非 ASCII 地址如 用户@example.com,而仅 ASCII 的正则将错误地拒绝它。自 RFC 6532 以来的行业共识:不要用正则验证邮箱,而是发送验证邮件。

URL。RFC 3986(2005 年 1 月)是 URI 通用语法规范,但 WHATWG URL Living Standard 有意偏离它,以匹配浏览器实际接受的内容。除了快速视觉检查之外,使用 JavaScript 中的 new URL("...") 或 Python 中的 urllib.parse,而不是正则表达式。

电话号码。ITU-T 建议 E.164(当前修订版 2010 年 11 月)允许最多 15 位数字,带可选 + 前缀,但国家特定规则差异巨大。谷歌的开源 libphonenumber 库为每个地区编码了每个国家的规则,是唯一可靠的跨国家验证器。

日期。^\d{4}-\d{2}-\d{2}$ 这样的正则匹配 ISO 8601-1:2019 日历格式,但它也接受 2026-02-31。日期有效性需要日历逻辑,而不是模式匹配;使用 Date.parse() 或日期库。

信用卡。正则可以匹配数字长度和 IIN 前缀(Visa 以 4 开头,Mastercard 以 51-552221-2720 开头,Amex 以 3437 开头),但无法验证 Luhn 校验和(汉斯·彼得·卢恩,IBM,1960 年 8 月授予的美国专利 2 950 048)。Luhn 需要逐位求和模 10。

开发者使用此库的常见方式

常见错误

更多常见问题

为什么有些模式使用 (?:...) 而不是 (...)?

(?:...)非捕获组:它为重复或交替分组,但不分配反向引用槽。它更快,避免污染结果数组中的 $1$2。当需要提取捕获的文本时使用 (...);仅用于分组时使用 (?:...)

最常见的正则标志是什么?

i 不区分大小写,g 全局(查找全部,JS 特定行为),m 多行(使 ^$ 匹配行边界),s dotAll(使 . 匹配换行符,ES2018+),u Unicode (ES2015+),y sticky (ES2015+),d hasIndices (ES2022+),v 集合记号类 (ES2024+)。组合为 /pattern/gimsu

如何匹配字面特殊字符?

用反斜杠转义。需要转义以获得字面匹配的正则元字符是:. ^ $ * + ? ( ) [ ] { } | \ /。在字符类 [...] 内,特殊字符的集合更小:只有 ] \ ^ - 需要转义,具体取决于位置。

我可以在 shell 脚本中使用此库的模式吗?

可以,但有保留。grep 默认使用 POSIX BRE;grep -E 使用 ERE;grep -P 在链接 libpcre 的系统上使用 PCRE(GNU grep,带 Homebrew 的 macOS grep)。使用环视、命名组或 Unicode 转义的模式需要 grep -Pripgrep(它使用 Rust 的基于 RE2 的引擎并拒绝环视)。

这些模式会发送到服务器吗?

不会。本页上的每个正则、你输入的每个搜索以及你在快速测试面板中测试的每个字符串都在你浏览器的 JavaScript 引擎中处理。不会发出任何网络调用。模式数据本身作为页面包中的静态 JSON 文件交付。打开 DevTools 中的网络标签以验证。

相关工具