oLoveTools
隔离运行的正则引擎

在线正则表达式测试、调试与解释工具

构建、测试和调试正则表达式:真正的语法树、每个捕获组的位置、灾难性回溯警告,以及导出到十种语言的代码——全部在你的标签页里完成。

每一处匹配都带上位置和捕获组
用树形结构解释模式,而不是一串平铺的列表
失控的模式会被终止,而不是冻住标签页
导出到 JavaScript、Python、Go、Rust 等十种语言
正则表达式
/
/
有效没有匹配已隔离
  • 在 [ ] 里点号本来就是字面量,没必要转义。
测试文本

点击高亮即可选中那一处匹配。按住 Alt 可以看到不带高亮的原文;F3 和 Shift+F3 在匹配之间跳转。

继续下一步
匹配结果

没有匹配

模式本身有效,只是在这段文本里没有出现。检查一下标志:没有 g 就只会报告第一处匹配。

这个模式在做什么
  • [\w.%+-]+重复一次或多次 — 贪婪:能吃多少吃多少,不得已才吐回来
    • [\w.%+-]以下之中的任意一个字符:\w . % + -
  • @字符「@」
  • [\w.-]+重复一次或多次 — 贪婪:能吃多少吃多少,不得已才吐回来
    • [\w.-]以下之中的任意一个字符:\w . -
  • \.字符「.」,按字面理解
  • [A-Za-z]{2,}至少重复 2 次 — 贪婪:能吃多少吃多少,不得已才吐回来
    • [A-Za-z]以下之中的任意一个字符:A–Z a–z

怎么用

1

写下模式

自己输入、从模式库里挑一个,或者粘贴别人分享的链接。模式会按每一段真正的身份着色,写错的地方就在原处画上下划线。

2

设好标志和模式

切换 g、i、m、s、u、v、y 和 d,再选择你是要查找、替换还是拆分。如果希望不按按钮就什么都不跑,把实时模式关掉。

3

安全地运行

匹配发生在一个有两秒上限的 Web Worker 里。每处匹配都会带着位置和捕获组返回,而面板会在你运行一个可能永远跑不完的模式之前先提醒你。

4

把成果带走

复制正则、把匹配结果导出成 JSON 或 CSV、生成十种语言的等价代码,或者把结果直接送进 oLoveTools 的另一个工具。

是解析器,不是分词器

模式会被解析成一棵真正的语法树,所以解释能说清什么包含什么,也不会把命名分组认错。分词器把 (?<year>\d{4}) 读成「一个捕获组,后面跟着一个可选的什么东西」;解析器读到的是它本来的样子:一个命名分组。

引擎跑在可以被杀掉的地方

匹配发生在带看门狗的 Web Worker 里。这里实测:在你浏览器所用的同一个引擎上,(a+)+$ 对付 31 个字符要占用四分多钟的纯 CPU。放在页面上那是一个死掉的标签页;放在 worker 里,那只是一次两秒后被终止的运行。

带真实位置的匹配

d 标志在后台自动打开,所以每个捕获组带的不只是抓到了什么,还有它从哪里开始、到哪里结束。正因如此才能在高亮的匹配内部画出各个分组,并且从列表直接跳到对应的那几个字符。

在你被烫到之前就出声

作用于重叠字符的嵌套量词、包着可能什么都不消耗的东西的量词、指向不存在分组的反向引用、缺少 u 标志的 \p{…}、以及在太旧的浏览器上使用后顾——这些都会在你运行任何东西之前被标出来。

导出到十种语言

JavaScript、TypeScript、Python、Java、C#、PHP、Go、Rust、Ruby 和 grep/sed,标志会被正确翻译,替换字符串也会改写成各语言自己的写法。当模式用到 RE2 做不到的东西时,Go 和 Rust 的代码会明说。

与整套工具串联

把替换后的文本、拆分出来的片段或 JSON 格式的匹配结果,直接送到 WordFlow、DiffSnap、JSONFlow、CodeCard 或 HashBolt——不必绕道下载文件夹。

正则表达式测试

一个不可能卡死你浏览器的正则测试工具

正则表达式是唯一一种必须在正确之前就被运行的东西,而错误的那一个可能是病态的:像 (a+)+$ 这样的模式碰上一个差一点就能匹配的字符串会花掉指数级的时间,而浏览器的引擎根本无法中断。RegexFlow 把每一次匹配都放进一个带两秒看门狗的 Web Worker 里执行。一旦超时,worker 会被终止并换上新的,你收到的是一条消息,而不是一个把你的模式困在里面的冻结标签页。

带名字和位置的捕获组
不只是查找,还能替换和拆分
运行前就给出回溯警告
十种目标语言

什么都不会离开这个标签页

模式、测试文本、替换字符串以及你打开的任何文件,都完全在你的浏览器里处理——没有上传,也没有任何服务器往返。文件由浏览器自带的 FileReader 读取。唯一可能出去的是一条分享链接,而且只有在你按下生成按钮时才会产生。

从跑得通的模式,到跑得通的代码

为调试而生,不是为演示

必须扛得住一行畸形数据的日志解析、既要接受也要拒绝的校验规则、在整个代码库里做的查找替换($1 必须落在正确的位置),以及你接手别人四十个字符的模式、动手之前必须先弄懂它在干什么的那一刻。解释树、位置信息和分组表就是为那一刻准备的。

引擎就是你将来上线要面对的那个

匹配用的是你浏览器自带的 RegExp,所以你看到的就是你的 JavaScript 会做的——包括那些各家实现有差异的部分,正因如此这个工具会去检测后顾和 unicodeSets 的支持情况,而不是想当然。导出到 Python、Go 或 Rust 时,差异会被明确写出来,而不是悄悄生成一段编译不过的代码。

常见问题

Q我的模式或测试文本会被发送到别处吗?

不会。所有处理都在你标签页里的 JavaScript 中完成,包括你打开的文件:它们由浏览器的 FileReader 读取,从不会被上传。你可以断开网络,工具照样能用。

Q如果我写了一个永远跑不完的模式会怎样?

它会被杀掉。匹配在一个带两秒看门狗的 Web Worker 里运行;worker 若没能及时回应,就会被终止并换上新的。这件事比听起来更重要:在你浏览器所用的同一个引擎上实测,(a+)+$ 对 31 个字符跑了四分多钟。放在主线程上,那就是一个你救不回来的标签页。

Q它用的是哪个正则引擎?

你浏览器原生的 RegExp,所以你测的就是你的 JavaScript 会做的。凡是各家支持有差异的地方,这个工具都是实测而不是假设:后顾(Safari 到 16.4 才有)、unicodeSets 的 v 标志,以及用于捕获组位置的 d 标志。缺了哪一个都会明确告诉你,而不是甩出一条让人摸不着头脑的错误。

Q为什么模式的解释是一棵树?

因为平铺的列表说不清什么在什么里面,也因为分词器会在解析器不会出错的地方出错:(?<year>\d{4}) 是一个命名分组,不是一个捕获组后面跟着一个可选字符。每一行都和它所描述的那几个字符绑定,所以把鼠标停在某一行上,模式里对应的部分就会亮起来。

Q替换支持 $1 和命名分组吗?

支持:$1 到 $99、$<名称>、代表整个匹配的 $&、代表前后文本的 $` 和 $',以及代表字面美元符号的 $$。你输入的每一个记号都会列在下面并说明它将变成什么,生成的代码还会把它们改写成各目标语言自己的写法——Python 用 \g<名称>,Java 和 C# 用 ${名称}。

Q可以用在很大的文件上吗?

可以,但超过 40,000 个字符后,工具就不再自动重跑,而是等你按下运行——每敲一个键就在大文件里搜一遍纯属白费力气。你也可以在任何体量下关掉实时模式,完全手动操作。

Q为什么生成的 Go 代码带着一条警告?

Go 和 Rust 用的是 RE2,它在设计上保证线性时间,因此没有前瞻、没有后顾,也没有反向引用。如果你的模式用到了其中任何一项,代码依然会显示出来,但会附上一条说明:照原样是编译不过的——这比给你一段悄悄失败的代码有用得多。

Q测试文本里的彩色高亮是什么意思?

每处匹配都用品红色勾出轮廓,选中的那一处更亮。在选中的匹配内部,各个捕获组有自己的紫色区段,所以你能一眼看出到底是哪些字符落进了 $1。按住 Alt 可以隐藏全部高亮,把文本按它本来的样子读。

相关搜索

正则表达式测试在线测试正则正则调试器正则表达式解释在线正则生成器正则替换工具灾难性回溯正则转 pythonjavascript 正则测试命名捕获组
oLoveTools 工具套件的一部分
oLoveTools

一个免费、私密、完全本地的正则表达式工作台。

© 2026 oLoveTools关于

RegexFlow | 免费在线正则表达式测试、调试与解释工具

免费的正则表达式测试工具:实时高亮、捕获组位置、语法树解释、回溯警告,并可导出到 Python、Go、Java 等语言。100% 在浏览器中运行。

常见问题

我的模式或测试文本会被发送到别处吗?

不会。所有处理都在你标签页里的 JavaScript 中完成,包括你打开的文件:它们由浏览器的 FileReader 读取,从不会被上传。你可以断开网络,工具照样能用。

如果我写了一个永远跑不完的模式会怎样?

它会被杀掉。匹配在一个带两秒看门狗的 Web Worker 里运行;worker 若没能及时回应,就会被终止并换上新的。这件事比听起来更重要:在你浏览器所用的同一个引擎上实测,(a+)+$ 对 31 个字符跑了四分多钟。放在主线程上,那就是一个你救不回来的标签页。

它用的是哪个正则引擎?

你浏览器原生的 RegExp,所以你测的就是你的 JavaScript 会做的。凡是各家支持有差异的地方,这个工具都是实测而不是假设:后顾(Safari 到 16.4 才有)、unicodeSets 的 v 标志,以及用于捕获组位置的 d 标志。缺了哪一个都会明确告诉你,而不是甩出一条让人摸不着头脑的错误。

为什么模式的解释是一棵树?

因为平铺的列表说不清什么在什么里面,也因为分词器会在解析器不会出错的地方出错:(?<year>\d{4}) 是一个命名分组,不是一个捕获组后面跟着一个可选字符。每一行都和它所描述的那几个字符绑定,所以把鼠标停在某一行上,模式里对应的部分就会亮起来。

替换支持 $1 和命名分组吗?

支持:$1 到 $99、$<名称>、代表整个匹配的 $&、代表前后文本的 $` 和 $',以及代表字面美元符号的 $$。你输入的每一个记号都会列在下面并说明它将变成什么,生成的代码还会把它们改写成各目标语言自己的写法——Python 用 \g<名称>,Java 和 C# 用 ${名称}。

可以用在很大的文件上吗?

可以,但超过 40,000 个字符后,工具就不再自动重跑,而是等你按下运行——每敲一个键就在大文件里搜一遍纯属白费力气。你也可以在任何体量下关掉实时模式,完全手动操作。

为什么生成的 Go 代码带着一条警告?

Go 和 Rust 用的是 RE2,它在设计上保证线性时间,因此没有前瞻、没有后顾,也没有反向引用。如果你的模式用到了其中任何一项,代码依然会显示出来,但会附上一条说明:照原样是编译不过的——这比给你一段悄悄失败的代码有用得多。

测试文本里的彩色高亮是什么意思?

每处匹配都用品红色勾出轮廓,选中的那一处更亮。在选中的匹配内部,各个捕获组有自己的紫色区段,所以你能一眼看出到底是哪些字符落进了 $1。按住 Alt 可以隐藏全部高亮,把文本按它本来的样子读。

相关搜索

正则表达式测试, 在线测试正则, 正则调试器, 正则表达式解释, 在线正则生成器, 正则替换工具, 灾难性回溯, 正则转 python, javascript 正则测试, 命名捕获组