正则表达式测试
输入正则表达式,勾选需要的标志,再粘贴一段文本:每处匹配都会随输入实时高亮,并列出其位置和捕获组。正则直接由浏览器自带的JavaScript正则引擎执行,结果与你的代码一致,文本也不会离开你的设备。
0 个字符 · 0 个词 · 0 行
匹配结果会在此高亮显示。0 个字符 · 0 个词 · 0 行
完全在当前浏览器标签页中运行,您的文本不会被上传或保存。
JavaScript 正则表达式语法
“第一个匹配”一列,是用构建本页的 JavaScript 引擎对每个模式在其文本上运行得出的。
| 令牌 | 含义 | 模式 | 文本 | 第一个匹配 |
|---|---|---|---|---|
\d | 数字 0–9 | /\d+/ | Order 66 shipped | 66 |
\w | 字母、数字或下划线(ASCII) | /\w+/ | snake_case-id | snake_case |
\s | 空白字符,包括制表符和换行符 | /\s+/ | two spaces | |
. | 除换行符外的任意字符(使用 s 时包括换行符) | /a.c/ | abc a-c | abc |
^ $ | 输入的开头和结尾(使用 m 时为行的开头和结尾) | /^\w+$/ | single | single |
[abc] | 所列字符之一 | /[aeiou]/ | rhythm and blues | a |
[^abc] | 未列出的任意字符 | /[^0-9]+/ | 2026-10-18 | - |
* + ? | 0 次或多次、1 次或多次、0 次或 1 次 | /colou?r/ | color colour | color |
{n,m} | n 到 m 次 | /\d{2,4}/ | 7 42 1999 123456 | 42 |
(…) | 捕获分组 | /(\d+)px/ | width: 320px | 320px |
(?<name>…) | 命名捕获分组 | /(?<h>\d\d):(?<m>\d\d)/ | at 09:45 | 09:45 |
(?:…) | 非捕获分组 | /(?:ab)+/ | ababab! | ababab |
a|b | 任一侧 | /cat|dog/ | hotdog | dog |
\b | 单词边界 | /\bcat\b/ | concat cat | cat |
(?=…) | 后面跟着(先行断言) | /\d+(?=%)/ | 50 of 75% | 75 |
(?<!…) | 前面不是(负向后行断言) | /(?<!\$)\b\d+/ | $30 or 40 | 40 |
\p{L} | 任意 Unicode 字母(需要 u) | /\p{L}+/u | naï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+)+这类嵌套量词,并让每个部分尽可能少地匹配。