工具

正则表达式测试

开发

测试 JavaScript 正则表达式,带匹配高亮与捕获组。

100% 客户端 无后端
输出
    本页内容

    什么是正则表达式测试器?#

    正则表达式是一种用来描述文本模式的紧凑写法——“所有长得像邮箱的字符串”、“每一行的第三个单词”、“所有不在引号里的数字”。写出表达式只是工作的一半,另一半是在把它写进生产代码之前,先在一段跟你真实数据接近的文本上看一看它到底匹配了什么。正则测试器就是干这件事的页面。

    本工具会实时把你的表达式跑在你的样本文本上,原地高亮每一处匹配,并把每个捕获组单独列出来——你不仅能确认”匹没匹配上”,还能确认”具体捕获到了什么”。它用的是 JavaScript 的正则引擎(跟你浏览器和 Node 里说的是同一套),所以这里跑出来的结果就是你代码里的行为。

    怎么使用#

    1. 在左上角两个 / 之间填入表达式。斜杠是页面上已经画好的,你不用自己敲——就像代码里写正则字面量那样。
    2. 在表达式右边的小框里填 标志位。最常用的几个:
      • g —— 找出全部匹配,而不是只找第一个。
      • i —— 忽略大小写。
      • m —— 让 ^$ 匹配每一行的行首行尾,而不是整个字符串的头尾。
      • s —— 让 . 也能匹配换行符。
      • u —— 按 Unicode 处理表达式(涉及到 emoji 和非 ASCII 字符时很关键)。
    3. 在下面填 测试文本。尽量贴一段跟你真实输入接近的文本——很多在干净样本上表现良好的表达式,一碰到脏数据就原形毕露。
    4. 看右边的高亮预览:每一处匹配都在原文里画出来,你一眼就能看出边界,包括那种匹配跑着跨过空白的尴尬情况。下面再按捕获组逐条列出:组的序号、捕获到的字符串、以及字符偏移。

    主要特性#

    • 实时高亮。 每一处匹配都在原文上渲染出来,边界一眼可辨——尤其是那种匹配跨过空白的情况。
    • 逐组捕获列表。 组号、捕获子串、字符偏移,一组一行。当表达式有三四个组、你需要分清谁是谁时,这是刚需。
    • 多个标志位可叠加。 gimsu 自由组合(比如 giu 表示全局 + 忽略大小写 + Unicode 感知)。
    • ReDoS 提醒。 某些表达式——典型如 (a+)+ 这种嵌套量词——在被刻意构造的输入上会指数级爆炸。只要这类表达式出现匹配,状态栏就会把表达式本身标成有风险,提醒你在它撞上恶意输入之前先动手简化。这个判断看的是表达式的形状,不是上一轮跑了多久;真要遇到灾难性的表达式,仍然可能卡住标签页——所以看到提醒就别忽视。
    • 内置上限。 输入被限制在 25 万字符以内,匹配列表超过几千条就停止增长(捕获面板只展示前 200 条),所以不小心粘进来一个超大文件,也不会无声无息地一直跑下去。
    • 不外发。 表达式和文本都在浏览器里处理,不往任何地方发请求。

    实例演示#

    假设你有一批日志行,想从以 HTTP 动词开头的那几行里把”方法”和”路径”拆出来。表达式这样写:

    (\w+)\s+(/[\w/-]+)

    标志位填 gm,测试文本贴这一段:

    GET /api/users
    POST /api/login
    DELETE /api/users/42
    not a log line
    PUT /api/items/3-qty

    工具会高亮第 1、2、3、5 行(第 4 行不是以单词加路径开头)。捕获列表会按行分别报告方法和路径——DELETE 是第 1 组,/api/users/42 是第 2 组,而且你能直接确认最后一行的路径组把末尾的 -qty 段也正确包进去了。

    常见问题#

    用的是哪一种正则语法?#

    JavaScript 的内置引擎——也就是 String.prototype.matchRegExp.prototype.exec 以及 Node 里正则字面量用的那一套。在这里跑通的表达式,原样放进你的前端代码或 Node 服务里也能跑。它不是 PCRE、RE2 或 Rust 的正则;如果你从 PHP、Go 代码里拷了一个表达式过来,先在这里跑一遍再用。

    工具提示可能存在 ReDoS,是什么意思?#

    有些表达式在被恶意构造的输入上会跑得极慢——经典例子是 (a+)+b 去匹配一串末尾不带 ba。攻击者正是利用这一点对基于正则的服务发起拒绝服务。这个警告是对表达式形状(嵌套量词、相互重叠的分支)的静态判断——只要这类表达式产生了一次匹配就会触发,而不是看上一轮跑了多久。看到警告时,请简化表达式:去掉嵌套量词、加上锚点,或如果你的目标引擎支持原子分组就用原子分组。

    为什么我的表达式只匹配了一次?#

    多半是漏了 g 标志。没有 g,JavaScript 的正则只匹配到第一处就停。加上 g 才会找出所有不重叠的匹配。

    . 能匹配换行吗?#

    默认不行——. 匹配的是除行结束符之外的任意字符。加 s 标志(俗称 “dotall”)后 . 才会跨行,这在匹配那些本身就包含换行的整块文本时很有用。