正则表达式测试器 — 在线测试和调试 Regex
输入模式,粘贴测试字符串,匹配结果即时高亮。捕获组、标志、错误信息——全部随输入实时更新。使用 JavaScript 正则引擎(和你的浏览器、Node.js 一样)。数据不出浏览器。
标志
Character Classes
.Any character\dDigit (0-9)\wWord character\sWhitespace
Quantifiers
*0 or more+1 or more?0 or 1{n,m}n to m times
Anchors
^Start of line$End of line\bWord boundary\BNon-word boundary
90 秒搞懂正则表达式
正则表达式是描述文本模式的迷你语言。模式 \d{3}-\d{4} 匹配 "555-1234" 这样的电话号码。模式 ^From:.+$ 匹配以 "From:" 开头的邮件头行。概念简单,但语法很快就会变得密集。
JavaScript 使用 ECMAScript 正则风格(定义在 ECMA-262)。和其他风格的关键区别:旧引擎没有后行断言(ES2018 才加入)、没有占有量词、没有原子组。如果你从 Python 或 PCRE 移植正则,注意这些差异。
我见过最常见的错误:忘了 . 默认不匹配换行符。如果测试字符串有换行而模式用了 .*,你会得到意外的部分匹配。加 s 标志(dotAll)或用 [\s\S]* 代替。
性能陷阱:嵌套量词如 (a+)+ 或 (.*a){20} 会导致灾难性回溯——引擎尝试指数级数量的路径。30 个字符的输入能让浏览器卡住几分钟。这个工具在浏览器里运行,所以坏模式只会冻结这个标签页,不会搞挂生产服务器。先在这里测试。
使用方法
- 输入正则模式——不需要分隔符(直接写模式,不用 /pattern/)。
- 设置标志:g(全部匹配)、i(不区分大小写)、m(多行)、s(点匹配换行)。
- 粘贴测试字符串,匹配结果实时高亮。
- 查看下方捕获组——每个 () 组单独显示匹配内容。
什么时候会用到
验证用户输入格式
邮箱、手机号、邮编、信用卡——都有模式。在放进验证代码之前先在这里构建和测试正则。提示:生产环境别用正则验证邮箱(用库),但正则适合做"看起来像不像邮箱"的客户端检查。
从日志文件提取数据
服务器日志、CSV 文件、API 响应——当你需要从非结构化文本中提取时间戳、IP 或错误码时。用捕获组构建模式,对样本日志行测试,然后在脚本中使用。
代码编辑器中的查找替换
VS Code、IntelliJ、Sublime——都支持正则查找替换。在这里用测试用例构建模式,然后粘贴到编辑器里。重构时特别有用:重命名变量、修改函数签名、更新导入路径。
调试"应该能用但就是不行"的正则
你写了个模式,对某些输入有效但对其他的失败。把失败的输入粘贴进来,看看匹配到底在哪里断掉。通常是漏了转义(\. vs .)、贪婪 vs 懒惰量词(.* vs .*?)、或者少了标志。
常见坑点
转义特殊字符
在正则里,. * + ? ^ $ { } [ ] ( ) | \ 都有特殊含义。要匹配字面量的点,用 \.——不是单独一个点。我见过生产 bug:有人把 "192.168.1.1" 当正则模式用,结果匹配了 "192x168y1z1",因为未转义的点匹配任何字符。
贪婪 vs 懒惰:.* vs .*?
.* 尽可能多地匹配(贪婪),.*? 尽可能少地匹配(懒惰)。模式 <tag>(.*)</tag> 对输入 "<tag>a</tag><tag>b</tag>"——贪婪匹配 "a</tag><tag>b",懒惰只匹配 "a"。拿不准就用 .*? 加上更具体的限定。
锚点很重要:^ 和 $ 配合多行标志
没有 m 标志时,^ 只匹配整个字符串的开头,$ 只匹配结尾。有 m 标志时,它们匹配每行的开头/结尾。如果你在处理多行文本且模式用了 ^,你大概需要 m 标志。
避免灾难性回溯
像 (a+)+ 或 (x+x+)+y 这样的模式在不匹配的输入上可能花指数级时间。引擎会尝试每种可能的方式来分割输入。经验法则:永远不要在重叠的字符类上嵌套量词。
示例
提取日期组件
用编号组从 ISO 日期格式中捕获年、月、日。
Input
(\d{4})-(\d{2})-(\d{2})Output
输入 "2024-03-15" → 组1: "2024", 组2: "03", 组3: "15"匹配邮箱格式
简化的邮箱模式(不符合 RFC 5322,但能抓住明显的非邮箱)。
Input
[\w.+-]+@[\w-]+\.[a-zA-Z]{2,}Output
匹配 "[email protected]"、"[email protected]"功能特点
- 实时匹配——结果随输入更新,不需要点按钮
- 所有 JavaScript 标志:g、i、m、s、u、v、y
- 捕获组显示,带编号
- 语法错误高亮,带描述性信息
- 匹配计数和位置指示
- 100% 浏览器运行——数据不发送到任何地方
常见问题
为什么我的正则在 Python 里能用但这里不行?
正则风格不同。Python 用类 PCRE 语法,有 JavaScript 没有的功能:后行断言(ES2018 才加入,旧浏览器不支持)、原子组、占有量词(a++)、详细模式(x 标志)。最常见的问题:Python 的 re.DOTALL 对应 JavaScript 的 s 标志。
怎么跨多行匹配?
两个选择:(1) 加 s 标志——让 . 匹配换行符。(2) 用 [\s\S] 代替 .——不需要 s 标志就能匹配包括换行在内的任何字符。如果要逐行匹配,用 m 标志让 ^ 和 $ 匹配行边界。
(?: ) 和 ( ) 有什么区别?
( ) 是捕获组——捕获匹配的文本供后续使用(反向引用、提取)。(?: ) 是非捕获组——为量词或选择分组但不捕获。不需要捕获值时用 (?: ),稍微快一点且保持组编号整洁。
为什么我的正则让页面卡死了?
灾难性回溯。在重叠字符上有嵌套量词的模式(如 (a*)*b 或 (.+)+$)在不匹配的输入上可能花指数级时间。引擎在放弃前尝试每种可能的组合。修复:让量词更具体,或重构避免在相同字符上嵌套量词。
怎么匹配字面量的特殊字符?
用反斜杠转义:\. 匹配点,\* 匹配星号,\( 匹配左括号,\\ 匹配反斜杠本身。在字符类 [ ] 里,大多数特殊字符失去特殊含义,除了 ] \ ^ -。拿不准就转义——多余的转义无害,漏掉的转义是 bug。
使用技巧与相关工作流
- 用正则表达式测试 JSON 数据?先格式化它,请使用我们的JSON 格式化.
- 需要对匹配的文本进行哈希验证?试试我们的Hash 生成器.
- 安全编码正则匹配到的 URL,请使用我们的URL 编解码.
- 正则中处理 Base64 编码的字符串?解码它们,请使用我们的Base64 编解码.