UltKit

正则表达式测试

输入正则表达式,勾选需要的标志,再粘贴一段文本:每处匹配都会随输入实时高亮,并列出其位置和捕获组。正则直接由浏览器自带的JavaScript正则引擎执行,结果与你的代码一致,文本也不会离开你的设备。

标志

0 个字符 · 0 个词 · 0 行

匹配结果会在此高亮显示。

0 个字符 · 0 个词 · 0 行

完全在当前浏览器标签页中运行,您的文本不会被上传或保存。

JavaScript 正则表达式语法

“第一个匹配”一列,是用构建本页的 JavaScript 引擎对每个模式在其文本上运行得出的。

令牌含义模式文本第一个匹配
\d数字 0–9/\d+/Order 66 shipped66
\w字母、数字或下划线(ASCII)/\w+/snake_case-idsnake_case
\s空白字符,包括制表符和换行符/\s+/two spaces
.除换行符外的任意字符(使用 s 时包括换行符)/a.c/abc a-cabc
^ $输入的开头和结尾(使用 m 时为行的开头和结尾)/^\w+$/singlesingle
[abc]所列字符之一/[aeiou]/rhythm and bluesa
[^abc]未列出的任意字符/[^0-9]+/2026-10-18-
* + ?0 次或多次、1 次或多次、0 次或 1 次/colou?r/color colourcolor
{n,m}n 到 m 次/\d{2,4}/7 42 1999 12345642
(…)捕获分组/(\d+)px/width: 320px320px
(?<name>…)命名捕获分组/(?<h>\d\d):(?<m>\d\d)/at 09:4509:45
(?:…)非捕获分组/(?:ab)+/ababab!ababab
a|b任一侧/cat|dog/hotdogdog
\b单词边界/\bcat\b/concat catcat
(?=…)后面跟着(先行断言)/\d+(?=%)/50 of 75%75
(?<!…)前面不是(负向后行断言)/(?<!\$)\b\d+/$30 or 4040
\p{L}任意 Unicode 字母(需要 u)/\p{L}+/unaïve 東京naïve

六个标志及其作用

g(全局)会找出所有匹配项,而不是找到第一个就停止;不加它时,列表中只有一条结果。i 忽略大小写。m(多行)让 ^ 和 $ 匹配每一行的开头和结尾,而不是只匹配整段文本的开头和结尾,匹配行尾空格之类的模式时需要用它。s(dotAll,ES2018 新增)让 . 也能匹配换行符。u(unicode)按码点处理文本,因此一个 emoji 算作一个字符,并启用 \p{L} 这类属性转义,可匹配任意文字系统中的任意字母。y(sticky,粘性)只在当前位置精确匹配,词法分析器用的就是这种模式。JavaScript 还有用于返回匹配索引的 d 和用于字符类集合运算的 v;本测试器只支持上面这六个。

在测试文本下方,每条匹配结果都会显示其索引和各个分组。编号分组来自普通括号,(?:…) 是不捕获的分组,而 (?<year>\d{4}) 会创建命名分组,并以名称显示,ISO 日期示例就展示了这一点。常用正则菜单会插入经过测试的起始模式,涵盖电子邮件地址、URL、IPv4 地址、十六进制颜色、UUID、重复单词和行尾空格。请把邮箱模式当作初步检查,而不是严格验证:完整的邮箱地址语法宽松得多,真正可靠的检验方式是发一封邮件。

后行断言与灾难性回溯

环视用于检查某个位置前后的内容,但不消耗字符。先行断言 (?=…) 和 (?!…) 一直是 JavaScript 的一部分;后行断言 (?<=…) 和 (?<!…) 在 ES2018 中引入,2023 年 Safari 16.4 支持后,所有主流浏览器都已可用。因此 (?<=\$)\d+ 能在 "$42" 中找到 42,且不包含美元符号。与许多其他引擎不同,JavaScript 允许任意长度的后行断言。

JavaScript 引擎采用回溯机制:某条路径失败时,会退回去尝试其他分支。(a+)+$ 这类嵌套量词会让同一段文本出现指数级数量的拆分方式,所以 30 个 a 后面跟一个 x 的字符串可能要花几秒,再多几个字母就可能要花几个小时。这就是灾难性回溯,在服务器上会演变成 ReDoS(拒绝服务攻击);2019 年 7 月 2 日,Cloudflare 就因一条有此缺陷的 WAF 规则导致网络瘫痪约半小时。由于本测试器在你的标签页中运行,这样的模式可能会让页面卡死;请刷新页面并重写模式,确保没有两个量词能争抢相同的字符,可以用 [^,]* 这类更精确的字符类代替 .*,或者使用锚点。如果要编辑文本本身而不是匹配文本,请参阅文本工具;更多开发者实用工具在开发者工具页面。

常见问题

为什么我的正则只匹配到一个结果?
可能是没有开启 g 标志。不开启时,引擎在第一个匹配后就会停止。勾选 g 即可列出所有匹配项;单独使用 y 标志也能找到多个,但只限于它们紧挨着出现的情况。
在JavaScript中,\d能匹配其他文字体系的数字吗?
不能。在 JavaScript 中,\d 只表示 0 到 9,\w 只表示 ASCII 字母、数字和下划线,即使开启 u 标志也一样。要匹配其他文字,请配合 u 使用 \p{Nd} 或 \p{L}。
在这里测试的正则在Python或PHP中效果一样吗?
基本语法可以通用,但细节有差异:Python 的命名分组写作 (?P<name>…),PHP 和 Python 支持 JavaScript 没有的占有量词,后行断言的规则也各不相同。请在目标引擎中重新测试。
如何匹配字面意义上的点号或括号?
用反斜杠转义:\. 匹配句点,\[ 匹配左方括号。在字符类内部,大多数符号本来就是字面字符,所以 [.] 同样只匹配一个点。
为什么输入正则时页面卡死了?
该模式很可能在你的文本上触发了灾难性回溯。请刷新页面,然后避免使用 (.*)* 或 (a+)+ 这类嵌套量词,并让每个部分尽可能少地匹配。