这个正则表达式:
(a)?b\1c
与“bc”不匹配,而这个:
(a?)b\1c
确实匹配。为什么是这样?我认为这些陈述是相同的。
在您的第一个示例(a)?b\1c中,\1指的是您的(a)组,这意味着您必须拥有a:

abac将匹配bac将匹配bc不匹配在您的第二个示例(a?)b\1c中,\1指的是(a?),其中a是可选的:

abac将匹配bac不匹配bc将匹配反向引用不关心您的外部?(在第一个示例中),它只关心括号内的内容。
这有点令人困惑,但让我们看看,我将从第二个正则表达式开始:
(a?)b\1c
当 this 尝试匹配bc时,它首先尝试(a?),但由于没有ain bc,()将捕获空字符串,因此当我们稍后在字符串中使用,""引用它时,将匹配始终可能的空字符串。\1\1
现在让我们来看第二种情况:
(a)?b\1c
(a)将尝试匹配a但失败,但由于整个组(a)?是可选的,所以正则表达式继续,现在它尝试找到一个bOK,然后\1但(a)? 没有匹配任何内容,即使是空字符串,所以匹配失败。
因此,这两个正则表达式之间的区别在于,在(a?)捕获组中捕获了一个空字符串,该字符串可以稍后引用并使用成功匹配\1,但(a)?会创建一个与任何内容都不匹配的可选捕获组,因此稍后使用它引用它\1总是会失败,除非该组实际上匹配了一个a.
在第一个版本中,括号捕获a所以\1返回a。
在第二个正则表达式中,括号 catcha?所以\1返回a?,表示“0 或 1 a”。
由于a在第二个正则表达式中是可选的,bc因此很好地匹配第二个正则表达式 ( b\1c)的结尾