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