跳到正文

← 全部工具

免费在线工具

JavaScript 正则表达式测试

输入正则、粘贴文本,立刻看到所有匹配被高亮,并附有匹配列表、捕获分组表、查找替换预览和拆分预览。本页测试的是 JavaScript 风格的正则,把正则复制到 Python、Java 或 PHP 之前,请先看看它们的差异。文本只留在这个页面里,不会上传。

这里测试的只是 JavaScript 的正则写法

不同语言的正则并不完全一样。Python、Java、PCRE(PHP、grep -P)和 .NET 与 JavaScript 在后行断言(lookbehind)规则、命名分组写法(这里是 (?<name>...),Python 是 (?P<name>...))、占有量词和原子分组(JavaScript 没有)以及标志位上都有差异。在这里能用的正则换个语言可能报错,反过来也一样。

标志位

支持 $1、$<名称>、$&(匹配到的内容)、$`(匹配之前的文字)和 $'(匹配之后的文字)。要输出美元符号请写 $$。

限制:正则 2,000 个字符,测试文本 1,000,000 个字符,最多列出 5,000 处匹配。全部在本页内运行,不会上传任何内容。

从示例开始

这些是用来学习的简化示例,不是校验器。真实的邮箱、网址和日期规则要复杂得多,不要用它们去校验用户输入。

工作方式

  • •正则由你浏览器自带的 JavaScript 正则引擎执行,所以结果与你自己代码里 new RegExp(pattern, flags) 的结果一致。其他语言可能不同:后行断言(lookbehind)的规则、命名分组写法、占有量词和原子分组最容易踩坑。
  • •匹配在后台线程里完成,而不是在页面本身。如果一个正则的运行时间超过你选的时限(默认 1 秒),后台线程会被停止,你会看到提示,而不是整个页面卡死。典型的例子是用 (a+)+$ 去匹配一长串 a:引擎要尝试指数级的匹配路径。
  • •不加 g 标志位只返回第一处匹配,加上 g 则返回全部。空匹配(例如 a* 或 \b 产生的)会用一个标记显示,不会陷入死循环。d 标志位会额外给出每个分组的起止位置。
  • •替换遵循 JavaScript 自己的规则:$1 是编号分组,$<名称> 是命名分组,$& 是整个匹配,$` 是匹配之前的文字,$' 是匹配之后的文字。拆分显示 String.split 的结果,其中的捕获分组也会加入拆出的片段。
  • •邮箱、网址、日期、IPv4 和十六进制颜色这些示例是为了讲解语法而刻意简化的:它们会放过一些无效的内容,也会拒绝一些有效的内容,所以不是校验器。
  • •为了保持页面流畅,正则最多 2,000 个字符,文本最多 1,000,000 个字符,最多列出 5,000 处匹配。

常见问题

我的正则在 Python、Java 或 PHP 里表现一样吗?
不一定。本页运行的是 JavaScript 正则。Python 和 Java 的命名分组写法不同(Python 用 (?P<name>...)),PCRE 和 Java 支持 JavaScript 没有的占有量词和原子分组,后行断言和标志位也因语言而异。在依赖某个正则之前,请在你真正使用的语言里再测一遍。
为什么我的正则被停止了?
它很可能发生了灾难性回溯:遇到 (a+)+ 这样的嵌套重复,或 (a|a)* 这样重叠的多选分支,一旦匹配失败引擎就要尝试指数级数量的路径。请让多选分支互不重叠、去掉嵌套重复,或者加上锚点。你也可以调大时限,但需要这样做的正则在实际代码里同样会很慢。
各个标志位是什么意思?
g 找出全部匹配,i 忽略大小写,m 让 ^ 和 $ 对每一行生效,s 让点号也匹配换行,u 开启 Unicode 模式(使用 \p{L} 以及把表情当作单个字符都需要它),y 只在指定位置匹配,d 给出分组位置,v 是较新的 Unicode 模式,只有浏览器支持时才会出现。
我的文字会被上传或保存吗?
不会。正则和文本只发送给本页内部的后台线程,不经过网络,也不会被保存。刷新页面会恢复为示例内容。

相关工具