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

时间:2015-06-05 23:16:11

标签: javascript regex

查看^\s*(_?)(\S+?)\1\s*$中的injector.js正则表达式。

我已经能够理解字符串scope :with_tagged_users, -> { Node.where('cached_num_user_tags > 0') } 是如何匹配的。第一个捕获组由_non_组成,第二个组由_组成,对第一个捕获组结果的引用为您提供non。因此,第一组是_,第二组是_,第三组是non

但是,我无法理解字符串___non如何与第二组匹配,前提是__引用了\1最终会在_开始时期望_的表达式。

1 个答案:

答案 0 :(得分:5)

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

总体而言,这种模式:

^从字符串的开头

开始

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

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

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

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

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

$匹配行/字符串

的结尾

主题: _

第1组:

第2组:_

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

主题: _non

第1组:

第2组:_non

最初,_在第1组中匹配,然后在第2组中匹配non。然后引擎会查找_\1引用,并在那里是none,因此引擎回溯和匹配将其从组1中删除并在组2中匹配。

主题: _non_

第1组:_

第2组:non

与上一个类似:最初{1}在组1中匹配,然后{2}在组2中匹配。然后引擎为_查找non }引用,它匹配,因此第1组保持其_,第2组只保留\1

主题: _

第1组:

第2组:non

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

主题: \1

第1组:

第2组:

这导致不匹配。引擎开始将第一个_放入组1,但是然后将空间放入组2中失败。因此它会备份并尝试将第一个_ _放入组2.由于没有组1,也没有_匹配。然后该空间由_匹配,但随后匹配在最终\1上失败,因为该模式在字符串结尾之前仅显示空格。

<强>旁注

您在评论中提到:

  

如果匹配第一个组的\s*,则必须与_匹配   __它是指表达式还是结果   表达

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