← 退出

正则测试

实时匹配并高亮结果

常用模板(点击套用)
正则表达式
标志
匹配结果 (4)
1023index 5
58index 13
199index 19
5index 23

关于正则测试

这个工具用来在浏览器里快速验证一条正则表达式:你输入表达式、标志和一段测试文本,页面会列出文本中所有被匹配到的片段,以及每个片段在原文里的起始位置(index)。它使用的是浏览器自带的 JavaScript 正则引擎(RegExp),所以这里调通的写法可以直接放进 JavaScript 代码里使用。需要先说明它不做的事情:它不会在原文里做彩色高亮,而是以列表形式展示匹配项;它也不支持替换、分组详情查看或者生成代码,只负责回答一个问题——这条正则在这段文本上到底匹配到了什么。

操作步骤

  1. 在页面顶部的「常用模板(点击套用)」里点一个按钮,例如「邮箱」或「日期(YYYY-MM-DD)」,对应的表达式会直接填进「正则表达式」输入框;也可以自己手写,默认内容是 \d+。
  2. 在「标志」输入框里填写需要的标志。默认是 g(全局匹配)。这个框只接受 g、i、m、s、u、y 六个字母,输入其他字符会被自动删掉。
  3. 在「测试文本」框里粘贴或输入要检查的文字。默认示例是一段含订单号、数量和价格的中文句子。
  4. 停止输入约 0.3 秒后,下方会出现「匹配结果 (N)」,N 是总匹配数量,每一项显示匹配到的内容和 index。没有命中时显示「无匹配」,表达式写错时标题变成「错误」并给出浏览器返回的错误信息。
  5. 根据结果继续修改表达式或文本,直到匹配到的内容与预期一致,再把表达式复制到你的代码里。

一个实际例子

用默认的测试文本「订单号 A1023,数量 58,价格 199.5」。表达式 \d+ 加 g 标志,实际运行得到 4 个匹配:1023(index 5)、58(index 13)、199(index 19)、5(index 23)。也就是说 199.5 被小数点拆成了两段。换成模板里的「整数/小数」表达式 -?\d+(\.\d+)?,结果变成 3 个匹配:1023(index 5)、58(index 13)、199.5(index 19),小数被完整保留。再看邮箱模板 [\w.-]+@[\w-]+\.[\w.-]+,对文本「联系 zhang.san@example.com 或 li-si@mail.cn」运行,得到 zhang.san@example.com(index 3)和 li-si@mail.cn(index 27)。这类对比能帮你发现表达式过宽或过窄的地方。以上数字都是用同样的 RegExp 逻辑实际运行得出的。

支持范围与已知限制

  • 只支持 JavaScript 风格的正则。Python、Java、PCRE 等引擎在命名分组写法、后行断言、内联修饰符等方面与 JS 有差异,这里通过不代表在别的语言里一定通过。
  • 标志只允许 g、i、m、s、u、y。d、v 等较新的标志在输入框里会被过滤掉,无法使用。
  • 无论你是否填写 g,工具都会列出全部匹配项(内部会自动补上全局匹配),所以这里看不到「不加 g 只匹配第一个」的效果。
  • 结果列表最多显示前 30 条,标题里的数字仍然是真实的总匹配数。超过 30 条时请缩小测试文本或收紧表达式。
  • 只显示整体匹配(相当于 m[0])和 index,不展示捕获分组的内容。需要检查分组时可以临时改写表达式。
  • 能匹配空字符串的表达式(如 x*)会在每个位置产生空匹配,列表里会出现很多内容为空的行,这是正则本身的行为。
  • 内置模板只是常见场景的简化写法,例如「身份证号」只检查 17 位数字加一位数字或 X,「手机号」只检查 1 开头加第二位 3 到 9 再加 9 位数字,不做真实性校验,不能当作严格的验证规则。

常见问题:为什么这里匹配了,放到我的代码里却不一样?

最常见的原因有三个。第一,语言不同,上面提到的引擎差异。第二,字符串转义:在 JavaScript 字符串字面量里写正则要把反斜杠写两遍("\\d"),而这里的输入框里直接写 \d 即可,复制时别把两种写法搞混。第三,标志位没带上,比如代码里没写 g 或 i,结果自然不同。

常见问题:提示「错误」时怎么办?

错误信息来自浏览器的 RegExp 构造函数,通常会指出问题类型,例如括号没有闭合会提示 Unterminated group(完整信息形如 Invalid regular expression: /(abc/g: Unterminated group)。常见原因包括括号不成对、量词前面没有可重复的内容、字符类写反了范围,或者用了当前标志下不允许的转义。先修正这些,再观察结果。

常见问题:为什么结果不是我每敲一个字就更新?

工具对输入做了 300 毫秒的防抖,停下来之后才执行匹配。这是为了避免在你输入过程中,把一个写到一半的表达式立刻拿去跑。如果表达式存在灾难性回溯(例如嵌套量词 (a+)+b 遇到一长串 a),匹配仍然可能让页面卡住,防抖只能降低触发频率,不能消除风险。遇到卡顿时关闭页面标签即可,并建议简化表达式。

常见问题:可以直接用内置的校验模板做表单验证吗?

不建议原样上线。例如「密码强度」模板用先行断言要求同时含小写、大写和数字且长度至少 8 位,但没有限制特殊字符;「端口号」模板虽然写了 0 到 65535 的分段,但在一段文本中查找时仍可能匹配到更长数字的一部分,需要自己加上 ^ 和 $ 锚点。把它们当作起点,按业务规则改写并充分测试后再使用。

常见问题:匹配到的 index 是按什么算的?

index 是 JavaScript 字符串中的下标,从 0 开始,按 UTF-16 代码单元计数。普通中文字符占一个单位,所以示例里「订单号 A」(含空格)占 5 个位置,A 后面的数字 1023 从 index 5 开始。部分 emoji 和生僻字占两个单位,会让后面的 index 比肉眼数到的大。

隐私与处理方式

匹配完全在你的浏览器本地完成,使用浏览器自带的 RegExp 计算,代码里没有把表达式或测试文本发送到任何服务器的请求。关闭或刷新页面后,输入的内容不会被保存。不过请注意,如果你自己在测试文本里粘贴了敏感信息,它们只存在于当前页面的内存里,同样不要在公共电脑上留下页面不关。