正则表达式测试器 — 在线测试和调试 Regex

输入模式,粘贴测试字符串,匹配结果即时高亮。捕获组、标志、错误信息——全部随输入实时更新。使用 JavaScript 正则引擎(和你的浏览器、Node.js 一样)。数据不出浏览器。

正则表达式
输入正则表达式
//

标志

测试字符串
输入要测试的字符串
测试和调试您的正则表达式

Character Classes

  • . Any character
  • \d Digit (0-9)
  • \w Word character
  • \s Whitespace

Quantifiers

  • * 0 or more
  • + 1 or more
  • ? 0 or 1
  • {n,m} n to m times

Anchors

  • ^ Start of line
  • $ End of line
  • \b Word boundary
  • \B Non-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 个字符的输入能让浏览器卡住几分钟。这个工具在浏览器里运行,所以坏模式只会冻结这个标签页,不会搞挂生产服务器。先在这里测试。

使用方法

  1. 输入正则模式——不需要分隔符(直接写模式,不用 /pattern/)。
  2. 设置标志:g(全部匹配)、i(不区分大小写)、m(多行)、s(点匹配换行)。
  3. 粘贴测试字符串,匹配结果实时高亮。
  4. 查看下方捕获组——每个 () 组单独显示匹配内容。

什么时候会用到

验证用户输入格式

邮箱、手机号、邮编、信用卡——都有模式。在放进验证代码之前先在这里构建和测试正则。提示:生产环境别用正则验证邮箱(用库),但正则适合做"看起来像不像邮箱"的客户端检查。

从日志文件提取数据

服务器日志、CSV 文件、API 响应——当你需要从非结构化文本中提取时间戳、IP 或错误码时。用捕获组构建模式,对样本日志行测试,然后在脚本中使用。

代码编辑器中的查找替换

VS Code、IntelliJ、Sublime——都支持正则查找替换。在这里用测试用例构建模式,然后粘贴到编辑器里。重构时特别有用:重命名变量、修改函数签名、更新导入路径。

调试"应该能用但就是不行"的正则

你写了个模式,对某些输入有效但对其他的失败。把失败的输入粘贴进来,看看匹配到底在哪里断掉。通常是漏了转义(\. vs .)、贪婪 vs 懒惰量词(.* vs .*?)、或者少了标志。

常见坑点

1.

转义特殊字符

在正则里,. * + ? ^ $ { } [ ] ( ) | \ 都有特殊含义。要匹配字面量的点,用 \.——不是单独一个点。我见过生产 bug:有人把 "192.168.1.1" 当正则模式用,结果匹配了 "192x168y1z1",因为未转义的点匹配任何字符。

2.

贪婪 vs 懒惰:.* vs .*?

.* 尽可能多地匹配(贪婪),.*? 尽可能少地匹配(懒惰)。模式 <tag>(.*)</tag> 对输入 "<tag>a</tag><tag>b</tag>"——贪婪匹配 "a</tag><tag>b",懒惰只匹配 "a"。拿不准就用 .*? 加上更具体的限定。

3.

锚点很重要:^ 和 $ 配合多行标志

没有 m 标志时,^ 只匹配整个字符串的开头,$ 只匹配结尾。有 m 标志时,它们匹配每行的开头/结尾。如果你在处理多行文本且模式用了 ^,你大概需要 m 标志。

4.

避免灾难性回溯

像 (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,}

功能特点

  • 实时匹配——结果随输入更新,不需要点按钮
  • 所有 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 编解码.