piapia123
zh

正则表达式解释

网络

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把一条正则逐段拆开,每一段配上它实际匹配什么。读别人的正则时最烦的不是语法难,而是没人告诉你那一段是干什么的 —— 这行看起来像乱码的东西,往往是三个字符类加两个断言拼起来的。 这里是用解析器读出来的,不是「让模型讲讲」。 一条正则的语义是确定的,而模型讲错了你没有任何办法核对 —— 它会用同样自信的语气说「`*` 是至少一次」,而你拿这条解释去改代码只会更糊涂。解析器写错了测试能抓住(这个模块有 44 条断言),模型讲错了抓不住。 三处刻意讲清楚的地方: · 量词贴着它修饰的东西。`ab*` 里 `*` 修的是 `b` 而不是 `ab`,所以输出里是两行「a」「b*」,而不是把它拆成三个记号 —— 拆开就看不出一件事了 · 字符类里的元字符不展开。`[.*]` 里的 `.` 与 `*` 就是这两个字符本身,不是「任意字符」与「量词」。这是正则里最常见的误解来源,所以宁可明说也不展开 · 量词前面没东西时明确指出。`*abc` 在多数引擎里是语法错误,静默当成字面字符会让你以为它匹配一个 `*` ⚠️ 它不判断这条正则对不对、快不快 —— 那要用「正则测试」那个工具实际跑一遍。这里只回答「它写的是什么意思」。

功能

  • 逐段列出:原文片段 + 它匹配什么,按括号层级缩进
  • 量词并进它修饰的那一条(`a*` 是一行,不是两行)
  • 字符类展开成人话:`[a-z0-9_]` → 列出每个区间与字符;取反的也说明
  • ⚠️ 字符类里的元字符不展开 —— `[.*]` 里那两个就是字符本身
  • 分组按类型区分:捕获组、命名捕获组、非捕获组、先行/后行断言
  • 覆盖预定义类(`\d` `\w` `\s` `\b`)、控制字符、反向引用(数字与命名)、Unicode 属性(`\p{…}`)
  • 标志(`g` `i` `m` `s` `u` `y` `d` `v`)逐个解释
  • ⚠️ 括号没闭合、字符类没闭合、量词前面没东西 —— 都会明确指出来,而不是闷头解释
  • 支持 `/模式/标志` 的常见写法,也接受只有模式
  • 不联网、不靠模型,解释完全来自模式本身的结构

使用方法

  1. 把正则粘进输入框 —— 带 `/` 定界符或不带都行
  2. 逐段看下面的拆解,缩进表示嵌套层级
  3. 有标志的话,末尾单独一节解释每个标志
  4. 想实际试匹配,用「正则测试」那个工具

常见问题

为什么不用 AI 来讲正则?
因为它的解释你核对不了。一条正则的语义是确定的,而模型讲错时用的是同样自信的语气 —— 「`*` 是至少一次」这种话说出来,不懂的人根本看不出问题,拿它去改代码只会更糊涂。解析器不一样:它读一个字符产一条说明,写错了测试立刻红(这个模块有 44 条断言盯着),而且同一条正则在哪儿跑都是同一个解释。解释器能做的事没必要交给模型。
`ab*` 到底修的是 b 还是 ab?
是 `b`。 量词只作用于紧挨着它前面那一个元素 —— `ab*` 匹配一个 `a` 后面跟零个或多个 `b`。想要「ab 整体重复」必须写成 `(ab)*`。这是初学者最容易搞错的一处,所以这里的输出把量词和它修饰的那一段放在同一行(`a` 一行、`b*` 一行),而不是拆成 `a`、`b`、`*` 三个记号 —— 拆开就看不出谁修饰谁了。
`[.*]` 里的点号和星号是什么意思?
就是这两个字符本身。 在字符类(方括号)里面,`.` 不再是「任意字符」、`*` 也不再是量词,它们只是普通的成员 —— `[.*]` 匹配「一个点或一个星号」。要写「句号或星号」之外的东西就得往外挪。这是正则里最常见的误解来源之一,所以这里刻意不展开,并且明说它们是字面量。
和「正则测试」有什么区别?
分工很清楚:这个回答「它写的是什么意思」,那个回答「它实际匹配到什么」。读别人的正则、或者自己写完检查逻辑时用这个;想知道某段文本到底匹不匹配、捕获组抓到了什么,用那个(它还能跑替换预览与 ReDoS 风险检查)。两边都指望对方能替代自己是不行的:解释得再清楚,也替代不了一次真实匹配;跑得出结果,也说不清为什么。

相关工具