这个正则表达式:
(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?)
,但由于没有a
in bc
,()
将捕获空字符串,因此当我们稍后在字符串中使用,""
引用它时,将匹配始终可能的空字符串。\1
\1
现在让我们来看第二种情况:
(a)?b\1c
(a)
将尝试匹配a
但失败,但由于整个组(a)?
是可选的,所以正则表达式继续,现在它尝试找到一个b
OK,然后\1
但(a)?
没有匹配任何内容,即使是空字符串,所以匹配失败。
因此,这两个正则表达式之间的区别在于,在(a?)
捕获组中捕获了一个空字符串,该字符串可以稍后引用并使用成功匹配\1
,但(a)?
会创建一个与任何内容都不匹配的可选捕获组,因此稍后使用它引用它\1
总是会失败,除非该组实际上匹配了一个a
.
在第一个版本中,括号捕获a
所以\1
返回a
。
在第二个正则表达式中,括号 catcha?
所以\1
返回a?
,表示“0 或 1 a
”。
由于a
在第二个正则表达式中是可选的,bc
因此很好地匹配第二个正则表达式 ( b\1c
)的结尾