实时匹配并高亮结果
这个工具用来在浏览器里快速验证一条正则表达式:你输入表达式、标志和一段测试文本,页面会列出文本中所有被匹配到的片段,以及每个片段在原文里的起始位置(index)。它使用的是浏览器自带的 JavaScript 正则引擎(RegExp),所以这里调通的写法可以直接放进 JavaScript 代码里使用。需要先说明它不做的事情:它不会在原文里做彩色高亮,而是以列表形式展示匹配项;它也不支持替换、分组详情查看或者生成代码,只负责回答一个问题——这条正则在这段文本上到底匹配到了什么。
用默认的测试文本「订单号 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 字符串字面量里写正则要把反斜杠写两遍("\\d"),而这里的输入框里直接写 \d 即可,复制时别把两种写法搞混。第三,标志位没带上,比如代码里没写 g 或 i,结果自然不同。
错误信息来自浏览器的 RegExp 构造函数,通常会指出问题类型,例如括号没有闭合会提示 Unterminated group(完整信息形如 Invalid regular expression: /(abc/g: Unterminated group)。常见原因包括括号不成对、量词前面没有可重复的内容、字符类写反了范围,或者用了当前标志下不允许的转义。先修正这些,再观察结果。
工具对输入做了 300 毫秒的防抖,停下来之后才执行匹配。这是为了避免在你输入过程中,把一个写到一半的表达式立刻拿去跑。如果表达式存在灾难性回溯(例如嵌套量词 (a+)+b 遇到一长串 a),匹配仍然可能让页面卡住,防抖只能降低触发频率,不能消除风险。遇到卡顿时关闭页面标签即可,并建议简化表达式。
不建议原样上线。例如「密码强度」模板用先行断言要求同时含小写、大写和数字且长度至少 8 位,但没有限制特殊字符;「端口号」模板虽然写了 0 到 65535 的分段,但在一段文本中查找时仍可能匹配到更长数字的一部分,需要自己加上 ^ 和 $ 锚点。把它们当作起点,按业务规则改写并充分测试后再使用。
index 是 JavaScript 字符串中的下标,从 0 开始,按 UTF-16 代码单元计数。普通中文字符占一个单位,所以示例里「订单号 A」(含空格)占 5 个位置,A 后面的数字 1023 从 index 5 开始。部分 emoji 和生僻字占两个单位,会让后面的 index 比肉眼数到的大。
匹配完全在你的浏览器本地完成,使用浏览器自带的 RegExp 计算,代码里没有把表达式或测试文本发送到任何服务器的请求。关闭或刷新页面后,输入的内容不会被保存。不过请注意,如果你自己在测试文本里粘贴了敏感信息,它们只存在于当前页面的内存里,同样不要在公共电脑上留下页面不关。