如果我有模式([a-z]){2,4}和字符串“ab”,我期望在反向引用\ 1中看到什么?
我得到“b”,但为什么是“b”而不是“a”?
我确信有一个有效的解释,但阅读各种网站解释正则表达式,我还没有找到一个。任何人
答案 0 :(得分:0)
我不确定为什么没有人把这个作为答案,但只是对于那个用类似问题点击这个页面的人来说,答案基本上是这个正则表达式:
([a-z]){2-4}
将匹配a
和z
之间的单个字符至少2
和4
次。它将分别匹配每个字符,覆盖先前匹配并存储到反向引用中的任何内容(即表达式中()
个字符之间的任何内容)。
类似的表达(在问题的评论中建议):
([a-z]{2,4})
移动后方引用以围绕整个匹配(2
- 4
字符a
- z
),而不是单个字符。
括号将捕获表示为反向引用。当重复在捕获内部时(第二个示例),它将捕获构成该重复的所有字符。当重复在捕获之外时(第一个例子),它将捕获一个字母,然后重复该过程,将下一个字母捕获到相同的反向引用中,从而覆盖它。在这种情况下,它将重复该过程多达2次,每次都会覆盖它。
因此,与目标abc
匹配将导致\1
等于c
。将目标与abcd
匹配将导致\1
等于d
。使用更多字母,并且根据用于运行正则表达式的函数(和语言),目标abcde
可能无法匹配,或者可能导致反向引用\1
等于{{1} (因为d
不是匹配的一部分)。
如果您使用e
反向引用(通常为abc
或abcd
,则第一个示例表达式可用于获取whole match
或$&
,还有$0
或\&
和Tcl,只有一个\0
字符) - 这将返回整个正则表达式匹配的整个字符串。