Javascript 这个正则表达式如何与组匹配

Javascript 这个正则表达式如何与组匹配,javascript,regex,Javascript,Regex,从中查看此正则表达式 我已经能够理解字符串\u non是如何匹配的。第一个捕获组由\uu组成,第二个捕获组由非组成,对第一个捕获组结果的引用将为您提供一个\u。因此,第一组是,,第二组是非,第三组是 但是,我无法理解字符串\u、\u non和\u如何与表达式中引用\1的第二组进行匹配,该表达式在开头给定\u的情况下期望在结尾处出现\u 模式:^\s*(\s+?)\1\s*$ 总的来说,这种模式: ^从字符串开头开始 \s*匹配0个或多个空格字符 (?匹配并捕获0或1下划线(捕获组1) (\S+?

从中查看此正则表达式

我已经能够理解字符串
\u non
是如何匹配的。第一个捕获组由
\uu
组成,第二个捕获组由
组成,对第一个捕获组结果的引用将为您提供一个
\u
。因此,第一组是
,第二组是
,第三组是


但是,我无法理解字符串
\u
\u non
\u
如何与表达式中引用
\1
的第二组进行匹配,该表达式在开头给定
\u
的情况下期望在结尾处出现
\u

模式:
^\s*(\s+?)\1\s*$

总的来说,这种模式:

^
从字符串开头开始

\s*
匹配0个或多个空格字符

(?
匹配并捕获0或1下划线(捕获组1)

(\S+?)
非贪婪匹配并捕获1个或多个非空白字符(捕获组2)

\1
匹配捕获组1中匹配的内容

\s*
匹配0个或多个空格字符

$
匹配行尾/字符串

主题:
\u

第一组:

第2组:
\uuu

最初,这将在第一个捕获组中匹配。但是,然后引擎移动到第二个捕获组,并且它希望至少有一个字符匹配,因此引擎回溯并从第一个捕获组中获取字符,因为第一个捕获组中的
使其成为可选的,并且
\uu
是非空格字符。然后,由于捕获组1中最终没有匹配的内容(因为必须满足组2),因此
\1
反向引用中没有匹配的内容

主题:
\u非

第一组:

第2组:
\u非

最初组1匹配
,然后组2匹配
。然后,引擎为该
\1
引用查找
\u
,但没有,因此引擎回溯并匹配将其从组1中删除,并在组2中匹配

主题:
\u非

第1组:
\uu

第2组:

与前一个相似:最初组1中匹配
,然后组2中匹配
。然后,引擎为它匹配的
\1
引用查找
\uu
,因此组1保留其
\u
,组2只保留

主题:
\uuu

第一组:

第二组:代码

这与第一个
示例基本相同。最初,第一个
\uu
在组1中匹配。然后,第2组中的第2个
\uuu
匹配。然后
\1
尝试匹配另一个
\u
,因为第1组得到了一个,但没有。但组2至少需要1个字符,但可以有更多字符,所以正则表达式引擎会备份并将组1的匹配放入组2中

主题:
\uuu

第一组:

第2组:

这导致没有对手。发动机开始将第一个
放入组1,但未能将空间放入组2。因此,它会备份并尝试将第一个
\uu
放入组2中。由于没有组1,因此也没有要匹配的
\1
。然后,空格由
\s*
匹配,但最后一个
\uu
的匹配失败,因为模式只显示字符串结尾之前的空格

旁注

你在评论中问道:

如果它与第一组的
\uu
匹配,它是否必须与中的
\u
匹配
\1
。是否
\1
它指的是 表情


它引用表达式的结果(实际捕获的内容),而不是表达式本身

表示匹配0或1
,有效地使
成为可选的。正则表达式最初将匹配第一个捕获的组,但随后回溯并放弃,因为您希望第二个捕获的组中至少有一个字符。@如果它匹配第一个组的
\uu
,它是否必须匹配
\1
中的
\u
\1
它是否引用了表达式?
\1
只是对第一个捕获组的引用。如果没有匹配项,则没有可参考项。请参阅我上面的编辑,了解它最初是如何匹配的,但给出了它up@CrayonViolent所以,这就是第二组如何匹配“non”和“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu