在使用带有量词的字符类时,为什么在反向引用中捕获最右边的字符?

时间:2011-09-23 17:13:17

标签: regex backreference quantifiers

如果我有模式([a-z]){2,4}和字符串“ab”,我期望在反向引用\ 1中看到什么?

我得到“b”,但为什么是“b”而不是“a”?

我确信有一个有效的解释,但阅读各种网站解释正则表达式,我还没有找到一个。任何人

1 个答案:

答案 0 :(得分:0)

我不确定为什么没有人把这个作为答案,但只是对于那个用类似问题点击这个页面的人来说,答案基本上是这个正则表达式:

([a-z]){2-4}

将匹配az之间的单个字符至少24次。它将分别匹配每个字符,覆盖先前匹配并存储到反向引用中的任何内容(即表达式中()个字符之间的任何内容)。

类似的表达(在问题的评论中建议):

([a-z]{2,4})

移动后方引用以围绕整个匹配(2 - 4字符a - z),而不是单个字符。

括号将捕获表示为反向引用。当重复在捕获内部时(第二个示例),它将捕获构成该重复的所有字符。当重复在捕获之外时(第一个例子),它将捕获一个字母,然后重复该过程,将下一个字母捕获到相同的反向引用中,从而覆盖它。在这种情况下,它将重复该过程多达2次,每次都会覆盖它。

因此,与目标abc匹配将导致\1等于c。将目标与abcd匹配将导致\1等于d。使用更多字母,并且根据用于运行正则表达式的函数(和语言),目标abcde可能无法匹配,或者可能导致反向引用\1等于{{1} (因为d不是匹配的一部分)。

如果您使用e反向引用(通常为abcabcd,则第一个示例表达式可用于获取whole match$&,还有$0\&和Tcl,只有一个\0字符) - 这将返回整个正则表达式匹配的整个字符串。