JavaScript 正则表达式测试工具

输入正则表达式,即可在输入时看到每个匹配都被高亮显示,并提供捕获分组、替换预览和现成的正则模式库。

在浏览器中运行无需注册不上传任何数据

匹配高亮

    
可使用 $1、$<name>、$&(整个匹配)
匹配详情
#索引匹配分组
正则速查表
.除换行符外的任意字符(使用 s 时为任意字符)
\d \w \s数字、单词字符、空白字符
\D \W \S非数字、非单词字符、非空白字符
[abc] [^abc]a、b、c 中任意一个 / 都不是
[a-z0-9]字符范围
\p{L} \p{N}Unicode 字母 / 数字(需要 u)
^ $输入的开头 / 结尾(使用 m 时为行的开头 / 结尾)
\b \B单词边界 / 非单词边界
* + ?0 次或多次、1 次或多次、0 次或 1 次
{n} {n,} {n,m}恰好 n 次、至少 n 次、n 到 m 次
*? +? ??惰性(尽可能少)
a|ba 或 b
(…)捕获分组,用 $1 引用
(?<name>…)命名分组,$<name>
(?:…)非捕获分组
\1 \k<name>反向引用
(?=…) (?!…)先行断言 / 负向先行断言
(?<=…) (?<!…)后行断言 / 负向后行断言
\. \* \\转义的字面字符
\n \t \r换行符、制表符、回车符
\uFFFFUnicode 码元
\u{1F600}码位(需要 u)
$&替换内容中的整个匹配
$` $'匹配之前 / 之后的文本

如何使用正则表达式测试工具

  1. 在两个斜杠之间输入你的模式,不要包含外侧的 /。
  2. 切换标志,例如 g(全部匹配)、i(忽略大小写)和 m(多行)。
  3. 粘贴测试文本。匹配项会在右侧高亮显示,并在下方列出其索引和捕获分组。
  4. 勾选替换并输入替换内容,例如 $1 或 $<name>,即可预览 String.replace 的结果。
  5. 从正则模式库中选择一个模式,以经过测试的邮箱、URL、IP 或日期正则为起点。

JavaScript 正则表达式

本测试工具使用你浏览器自带的 RegExp 引擎,因此结果与 JavaScript 和 Node.js 中 String.match、matchAll、replace 和 RegExp.exec 的返回完全一致。这也包括现代语法:命名分组 (?<name>…)、后行断言 (?<=…)、配合 u 标志使用的 Unicode 属性转义(如 \p{L}),以及配合 d 标志使用的匹配索引。

各标志的作用

标志名称作用
gglobal查找所有匹配,而不是在第一个匹配处停止。
iignoreCase匹配字母时不区分大小写。
mmultiline^ 和 $ 匹配每一行的开头和结尾。
sdotAll. 也匹配换行符。
uunicode将模式按码位处理;启用 \p{…} 和 \u{…}。
ysticky只在当前 lastIndex 位置进行匹配。
dhasIndices报告每个捕获分组的起止位置。

灾难性回溯保护

带有嵌套量词的模式,例如 (a+)+$ 或 (\w|\d)*x,在面对几乎匹配的输入时可能需要指数级的时间。在普通网页中,这会让标签页卡死。在这里,每次匹配都运行在后台 Web Worker 中,超过一秒就会被终止,你会看到明确的警告,而不是浏览器卡死。同样的模式出现在生产代码中可能就是 ReDoS 漏洞,所以请把这个警告当作需要修复的 bug。

编写更好正则的技巧

  • 校验整个值时,用 ^ 和 $ 锚定模式,否则字符串中任意位置的匹配都会通过。
  • 优先使用 [^"]* 这样具体的字符类,而不是 .*;它们更快,也能避免过度匹配。
  • 不需要捕获的值时,使用非捕获分组 (?:…)。
  • 为分组命名。match.groups.year 比 match[1] 更易读。

常见问题

这个测试工具使用哪种正则风格?
JavaScript(ECMAScript),通过浏览器内置的 RegExp 实现。大部分语法与 PCRE、Python 和 Java 通用,但占有量词、原子分组以及 (?i) 这样的内联修饰符在 JavaScript 中不可用。
为什么我的模式只找到一个匹配?
没有 g(全局)标志时,JavaScript 会在第一个匹配后停止。启用 g 即可找到所有匹配。
如何在替换内容中引用分组?
用 $1、$2… 引用编号分组,用 $<name> 引用命名分组,用 $& 表示整个匹配,用 $$ 表示字面上的美元符号。
为什么测试因超时而停止?
该模式在你的输入上运行超过了一秒,这几乎总是意味着灾难性回溯。请查找 (x+)+ 这样的嵌套量词或 (a|a)* 这样相互重叠的分支,并改写它们,使每个字符只能以一种方式被匹配。
我的测试数据会被发送到任何地方吗?
不会。匹配在你浏览器内的 Web Worker 中本地运行。你的模式和文本只保存在你自己的浏览器中,方便你下次回来时继续使用。

相关工具