1

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

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

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

4

1 回答 1

0

我不确定为什么没有人把这个作为答案,但对于任何人在这个页面上遇到类似的问题,答案本质上就是这个正则表达式:

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

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

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

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

移动反向引用以包围整个匹配(2-4字符a- z)而不是单个字符。

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

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

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

于 2011-11-14T17:03:19.597 回答