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|b | a 或 b |
| (…) | 捕获分组,用 $1 引用 |
| (?<name>…) | 命名分组,$<name> |
| (?:…) | 非捕获分组 |
| \1 \k<name> | 反向引用 |
| (?=…) (?!…) | 先行断言 / 负向先行断言 |
| (?<=…) (?<!…) | 后行断言 / 负向后行断言 |
| \. \* \\ | 转义的字面字符 |
| \n \t \r | 换行符、制表符、回车符 |
| \uFFFF | Unicode 码元 |
| \u{1F600} | 码位(需要 u) |
| $& | 替换内容中的整个匹配 |
| $` $' | 匹配之前 / 之后的文本 |
如何使用正则表达式测试工具
- 在两个斜杠之间输入你的模式,不要包含外侧的
/。 - 切换标志,例如
g(全部匹配)、i(忽略大小写)和m(多行)。 - 粘贴测试文本。匹配项会在右侧高亮显示,并在下方列出其索引和捕获分组。
- 勾选替换并输入替换内容,例如
$1或$<name>,即可预览String.replace的结果。 - 从正则模式库中选择一个模式,以经过测试的邮箱、URL、IP 或日期正则为起点。
JavaScript 正则表达式
本测试工具使用你浏览器自带的 RegExp 引擎,因此结果与 JavaScript 和 Node.js 中 String.match、matchAll、replace 和 RegExp.exec 的返回完全一致。这也包括现代语法:命名分组 (?<name>…)、后行断言 (?<=…)、配合 u 标志使用的 Unicode 属性转义(如 \p{L}),以及配合 d 标志使用的匹配索引。
各标志的作用
| 标志 | 名称 | 作用 |
|---|---|---|
g | global | 查找所有匹配,而不是在第一个匹配处停止。 |
i | ignoreCase | 匹配字母时不区分大小写。 |
m | multiline | ^ 和 $ 匹配每一行的开头和结尾。 |
s | dotAll | . 也匹配换行符。 |
u | unicode | 将模式按码位处理;启用 \p{…} 和 \u{…}。 |
y | sticky | 只在当前 lastIndex 位置进行匹配。 |
d | hasIndices | 报告每个捕获分组的起止位置。 |
灾难性回溯保护
带有嵌套量词的模式,例如 (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 中本地运行。你的模式和文本只保存在你自己的浏览器中,方便你下次回来时继续使用。