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