正则模式库,免费
60+ 个即用的正则模式。在线搜索、复制和测试。
关于此库
这是一个经过整理、可搜索的60+ 个常用正则表达式模式集合,按类别分组。每个模式都包含描述、表达式本身以及示例匹配。点击模式即可复制,或使用快速测试面板直接在此页面针对它校验文本。
一切都在您的浏览器中运行 · 模式或测试文本不会发送到任何地方。您可以在 JavaScript、Python、PHP、Java、Go 或任何支持正则的语言中使用这些模式。若需带标志和捕获组的更高级测试,请试试我们的 正则表达式测试器。
工作原理
- 浏览或搜索:按类别(验证、提取、格式化)浏览模式,或按名称或用例搜索。
- 预览模式:每条记录都会显示正则表达式、对其匹配内容的描述、带匹配的示例输入以及限制。
- 用您的数据测试:输入您自己的测试字符串,验证模式是否能捕获您期望的内容。
- 复制使用:以 JavaScript、Python 或 POSIX 格式复制正则模式,用于您的代码。
为什么使用正则库?
从零开始编写正则表达式既耗时又容易出错。验证邮箱、匹配 URL、提取电话号码、检测信用卡、解析日期或验证 IP 地址等常见模式都有久经考验的解决方案 · 但找一个可靠版本通常需要在 Stack Overflow 上搜索、评估其正确性并检查边缘情况。此库将经过验证的模式与其记录的边缘情况、已知限制和具体测试用例集中在一起。这比自己写更快,比未经测试从互联网随机来源复制粘贴更可靠。
模式类别
- 验证 · 邮箱、URL、电话号码、信用卡、IP 地址、邮政编码
- 提取 · 日期、货币、hashtag、@提及、域名
- 格式化 · 空白规范化、数字格式、slug 生成
- 安全 · 密码强度、SQL 注入检测、XSS 模式
- 代码 · HTML 标签、注释、变量名、CSS 值
正则表达式从何而来
「正则集」的数学概念由 斯蒂芬·科尔·克莱尼于 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」)、sed 和 awk。拉里·沃尔 的 Perl (1987) 特别是 Perl 5 (1994) 添加了命名组、环视、非贪婪量词和 Unicode 处理,这些成为了被称为 PCRE 的事实方言,菲利普·哈泽尔 在 1997 年将其移植到 C 作为库。
引擎方言及它们之间的变化
在 JavaScript 中干净运行的模式可能在 Go 中无声失败,在 POSIX 中直接被拒绝。开发者最可能遇到的五种方言:
- POSIX BRE / ERE (IEEE Std 1003.2-1992):标准 Unix 系统上
grep、sed和awk的方言。没有环视、没有命名组、没有 Unicode 属性转义。BRE 还要求转义(、)、{、}和|。 - PCRE2(菲利普·哈泽尔,1997,当前主版本 10.x):功能最完整的方言。环视、命名组
(?<name>...)、原子组、占有量词、递归。由 PHPpreg_*、Apache、nginx、R 使用。 - ECMAScript 正则(ECMA-262,正则部分 22.2):JavaScript 方言。ES2018 添加了命名组、后向断言以及
s(dotAll) 和u(Unicode) 标志。ES2022 添加了d标志用于匹配索引。ES2024 添加了v标志,带有集合记号类。 - Python
re:接近 PCRE,但使用(?P<name>...)表示命名组(PEP 433),并具有不同的详细模式re.X。较新的第三方模块regex添加了递归模式和 POSIX 最长匹配语义。 - RE2(拉斯·考克斯,2010):Go 的
regexp和 Rust 的regexcrate 背后的引擎。没有环视、没有反向引用、没有占有量词,这是故意的。权衡:保证线性时间,无灾难性回溯。如果本库中的模式使用(?=...)或\1,它将无法在 Go 中编译。
灾难性回溯与 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-55 或 2221-2720 开头,Amex 以 34 或 37 开头),但无法验证 Luhn 校验和(汉斯·彼得·卢恩,IBM,1960 年 8 月授予的美国专利 2 950 048)。Luhn 需要逐位求和模 10。
开发者使用此库的常见方式
- 客户端表单提示,理解正则匹配是提示,而不是最终验证。
- 日志抓取,从应用日志中提取时间戳、IP、错误代码和 URL 到管道中。
- 一次性数据清理:规范化空白、剥离 HTML 标签、在日期格式之间转换、标题 slugify 化。
- 编辑器查找和替换,在 VS Code、Sublime、vim、IntelliJ 中,正则方言接近 PCRE。
- 路由和 URL 匹配模式,在 Express、Flask、FastAPI、Rails 中。
- WAF 和入侵检测规则,对 ReDoS 极其小心,正如 Cloudflare 2019 事件所证明的那样。
- 快速字符串测试,在本页底部测试面板中,在将模式提交到代码之前。
常见错误
- 忘记锚点。没有
^和$(或 PCRE 中的\A和\z),如果模式出现在字符串的 任何位置,验证正则就会匹配。/\d{4}/匹配「year 2026 was good」,这几乎从来不是你想要的。 - 信任
.*跨越多个事物。<a href=".*">在输入<a href="a"><a href="b">上跨越两个标签捕获,因为.*是贪婪的。使用.*?进行惰性匹配,或者更好,用真正的解析器解析。 - 假设点匹配换行符。默认情况下,
.匹配除行终止符外的所有内容。在 JS 中使用s(dotAll) 标志,或在 Python 中使用re.DOTALL,或在 PCRE 中使用内联修饰符(?s)。 - 假设
\w包含非 ASCII 字母。在 ASCII 模式中,\w是[a-zA-Z0-9_]。在 JS 中添加u标志 (ES2018+),并使用\p{L}表示任何 Unicode 字母;在 Python 中添加re.UNICODE(Python 3 中默认)。 - Go 中的反向引用。Go 的
regexp是 RE2,在编译时拒绝\1。错误「error parsing regexp: invalid escape sequence: \1」意味着该模式需要分解为非正则方法。 - 用正则解析 HTML。众所周知不可行:HTML 不是正则语言。使用 DOM 解析器(浏览器的内置
DOMParser、cheerio、BeautifulSoup、lxml)。
更多常见问题
为什么有些模式使用 (?:...) 而不是 (...)?
(?:...) 是 非捕获组:它为重复或交替分组,但不分配反向引用槽。它更快,避免污染结果数组中的 $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 -P 或 ripgrep(它使用 Rust 的基于 RE2 的引擎并拒绝环视)。
这些模式会发送到服务器吗?
不会。本页上的每个正则、你输入的每个搜索以及你在快速测试面板中测试的每个字符串都在你浏览器的 JavaScript 引擎中处理。不会发出任何网络调用。模式数据本身作为页面包中的静态 JSON 文件交付。打开 DevTools 中的网络标签以验证。