跳到正文

正则表达式解读

Regex Explainer

把正则拆成一棵带标注的树,让每一段究竟匹配什么变成可读的。

把一个正则表达式拆成一棵树,说明每一部分做什么——每个组、量词、字符类和断言,按模式本身的嵌套方式排列。它和测试器是同一个界面、打开在解读标签上,因为读一个模式和运行它是同一件事。

🔒 完全在你的浏览器里运行regexexplainlearn
视图

模式

//g

在字符串的任何位置都能匹配、2 个捕获组。

每一段各做什么

([\w.+-]+)@([\w-]+\.[\w.-]+)按顺序

这些必须一个接一个地全部匹配上,中间不能有别的东西。

([\w.+-]+)第1个捕获组

匹配里面的模式,并把命中的文本记下来,可以用 `match[1]` 取,替换串里则写 `$1`。

[\w.+-]+按 + 重复

重复一次或更多次,但尽量多取,只有后面匹配不上时才往回让。

[\w.+-]这个集合里的任意一个字符

正好匹配一个字符,取下列各项中在输入里最先出现的那个。

在类里面,`.` 就是一个句点。它在这里不表示「任意字符」,转义与否都一样。

\w任意一个单词字符

就是 `[A-Za-z0-9_]`。

只限 ASCII。对 JavaScript 正则来说,`é`、`한` 和 `ß` 都不是单词字符,所以 `\w+` 匹配不上韩文或带重音的词。

.字符 “.” (U+002E)

完全照原样匹配,大小写也算。

+字符 “+” (U+002B)

完全照原样匹配,大小写也算。

-字符 “-” (U+002D)

完全照原样匹配,大小写也算。

@字符 “@” (U+0040)

完全照原样匹配,大小写也算。

([\w-]+\.[\w.-]+)第2个捕获组

匹配里面的模式,并把命中的文本记下来,可以用 `match[2]` 取,替换串里则写 `$2`。

[\w-]+\.[\w.-]+按顺序

这些必须一个接一个地全部匹配上,中间不能有别的东西。

[\w-]+按 + 重复

重复一次或更多次,但尽量多取,只有后面匹配不上时才往回让。

[\w-]这个集合里的任意一个字符

正好匹配一个字符,取下列各项中在输入里最先出现的那个。

\w任意一个单词字符

就是 `[A-Za-z0-9_]`。

只限 ASCII。对 JavaScript 正则来说,`é`、`한` 和 `ß` 都不是单词字符,所以 `\w+` 匹配不上韩文或带重音的词。

-字符 “-” (U+002D)

完全照原样匹配,大小写也算。

\.字符 “.” (U+002E)

完全照原样匹配,大小写也算。

这里的反斜杠是多余的——这个字符在这个位置没有特殊含义。

[\w.-]+按 + 重复

重复一次或更多次,但尽量多取,只有后面匹配不上时才往回让。

[\w.-]这个集合里的任意一个字符

正好匹配一个字符,取下列各项中在输入里最先出现的那个。

在类里面,`.` 就是一个句点。它在这里不表示「任意字符」,转义与否都一样。

\w任意一个单词字符

就是 `[A-Za-z0-9_]`。

只限 ASCII。对 JavaScript 正则来说,`é`、`한` 和 `ß` 都不是单词字符,所以 `\w+` 匹配不上韩文或带重音的词。

.字符 “.” (U+002E)

完全照原样匹配,大小写也算。

-字符 “-” (U+002D)

完全照原样匹配,大小写也算。

标志

g — global
不会在第一处命中就停下,而是全部找出来。代价是 `.test()` 和 `.exec()` 会在两次调用之间推进 `lastIndex`,「隔一次就失败一次」通常就是这么来的。

怎么用

  1. 粘贴你继承下来的模式

    配置文件里那条谁也不记得是谁写的。它是被解析的,不是被模式匹配的,所以拆解遵循真实的结构。

  2. 顺着树往下读

    每个节点显示源片段、它是什么、它做什么。说明会标出常让人吃惊的部分——嵌套的量词、一个本不必捕获却在捕获的组。

  3. 切到「测试」核对你的理解

    模式会一起带过去。理解一个正则和确认它做的是你以为的事是两个不同的步骤,第二步是便宜的那个。

常见问题

嵌套量词上的警告是什么意思?

像 `(a+)+` 这样的东西给引擎指数级多的方式来切分同一段文本,所以一个不匹配的输入可能花的时间比宇宙年龄还长。大多数正则表达式拒绝服务背后就是这个形状。

为什么它告诉我某个组是捕获的?

因为一个你不使用的捕获组占一个位置,还会把你使用的那些组的编号挪位。`(?:…)` 分组而不捕获,让 `$1` 继续指向你想要的东西。

它也解释标志吗?

解释,在单独的面板里——你设置的每个标志、它的名字,以及它改变什么。`m` 和 `s` 尤其值得读,因为它们的名字让人以为是对方的行为。

可以从这些接进来

接下来

这些工具吃得下当前工具的产出,结果可以直接送过去。