正则表达式测试工具

在浏览器中运行,不上传任何内容

用你的文本测试 JavaScript 正则表达式,支持捕获组和替换。

Test text

Type a pattern

Matches are listed here with their position and capture groups. Patterns use JavaScript's RegExp, as in browsers and Node.js; type them without the surrounding slashes.
Type a pattern
/gLn 1, Col 1

什么是正则表达式?

正则表达式(regex)是描述一组字符串的模式。\d{3} 表示三个数字,[a-z]+ 表示一个或多个小写字母,^ 和 $ 把匹配锚定在开头和结尾。程序用模式来查找、提取、校验和替换文本。

模式中用括号括起来的部分是捕获组。用 (\d{4})-(\d{2}) 匹配 2025-07 时,第 1 组是 2025,第 2 组是 07。像 (?<year>\d{4}) 这样的命名组可以按名称引用某一部分。标志(flag)会改变整个模式的行为:i 忽略大小写,g 查找所有匹配而不只是第一个。

本工具运行的是 JavaScript 的 RegExp,也就是浏览器和 Node.js 中的引擎,所以在这里能用的模式,在 JavaScript 和 TypeScript 中效果完全相同。其他语言的语法大部分相同,但并不完全一致;下面的问答列出了最常见的差异。

使用方法

  1. 1在两个斜杠之间的输入框中输入模式,不要包含斜杠本身。Presets 会载入一个模式及示例文本。
  2. 2在工具栏中开关标志:g 全局,i 忽略大小写,m 多行,s dotAll,u 和 v Unicode 模式,y 粘连,d 组索引。鼠标悬停在标志上可以查看说明。
  3. 3把要搜索的文本粘贴到 Test text,或把文件拖进去。输入时匹配会被高亮,并在 Matches 中列出行号、列号和捕获组。
  4. 4点击某个匹配,或在模式输入框中按 Enter(其他位置按 F7),即可在文本中选中它并高亮其捕获组。Shift+Enter 或 Shift+F7 返回上一个。
  5. 5打开 Replace,试试 $2/$1 或 $<year> 这样的替换并查看结果。Apply to test text 会把结果写入文本;Ctrl+Z 可以撤销。

问题排查

2 秒后被中止
该模式在这段文本上出现了灾难性回溯:(a+)+ 或 (.*,)* 这样的嵌套量词在失败前会尝试指数级数量的匹配方式。让每个重复部分只有一种匹配方式,例如用 [^,]* 代替 .*。同样的模式也可能让服务器卡死,所以这里会中止它。
模式在代码里能用、在这里不行,或者反过来
在代码的字符串字面量中,每个反斜杠都要写两遍("\\d+")。在这里输入的是模式本身,只用一个反斜杠(\d+),就像 /\d+/ 两个斜杠之间的写法。
只找到一个匹配
g 标志没有打开。没有它,搜索会在第一个匹配后停止,Replace 也只替换第一个。
^ 或 $ 只匹配一次
没有 m 标志时,它们只匹配整个文本的开头和结尾。打开 m 后会在每一行匹配。
使用 u 标志时出现无效转义或无效分组
Unicode 模式更严格:没有意义的转义(例如字符类之外的 \-)会变成错误。去掉反斜杠,或关闭 u。

常见问题

JavaScript 的正则和 PCRE、Python 或 Java 有什么不同?

JavaScript 没有占有量词(a++)和原子组((?>…)),没有 \A 和 \Z(请使用不带 m 标志的 ^ 和 $),也不支持在模式开头写 (?i):请改用开关设置标志。Python 的命名组写作 (?P<name>…),而 JavaScript 写作 (?<name>…)。当前浏览器都支持后行断言、命名组以及 \p{L} 这样的 Unicode 属性转义(需配合 u 或 v)。

m 和 s 标志有什么区别?

m(多行)让 ^ 和 $ 匹配每一行的开头和结尾。s(dotAll)让 . 也能匹配换行;没有它时,. 匹配除换行以外的任意字符。

邮箱预设是完整的邮箱校验器吗?

不是。它用于在文本中找出常见的 name@domain.tld 形式,这通常正是你在日志或响应中搜索时需要的。完整的邮箱地址标准允许的写法要多得多。要校验地址,先检查基本格式,再发送一封确认邮件。

我的文本会发送到服务器吗?

不会。匹配在你的浏览器中、由本页面的后台 worker 运行,不会上传任何内容。为了刷新后不丢失,模式和文本会保存在当前标签页的 session storage 中,直到你清除它或关闭标签页。Copy link 会把输入放在链接的 # 之后,浏览器从不把这部分发送给服务器,但拿到链接的人都能看到内容。