这个正则表达式:
(a)?b\1c
与“bc”不匹配,而这一个:
(a?)b\1c
确实匹配它。为什么是这样?我认为这些陈述是完全相同的。
答案 0 :(得分:6)
在您的第一个示例(a)?b\1c
中,\1
指的是您的(a)
群组,这意味着您必须拥有a
:
abac
将匹配bac
将匹配bc
将不匹配在您的第二个示例(a?)b\1c
中,\1
引用(a?)
,其中a
是可选的:
abac
将匹配bac
将不匹配bc
将匹配后退参考不关心你的外部?
(在第一个例子中),它只关注括号内的内容。
答案 1 :(得分:3)
这有点令人困惑,但是让我们看看,我将从第二个正则表达式开始:
(a?)b\1c
当尝试匹配bc
时,它首先尝试(a?)
,但由于a
中没有bc
,()
将捕获空字符串{{ 1}}所以当我们稍后使用""
在字符串中引用它时,\1
将匹配始终可能的空字符串。
现在让我们进入第二种情况:
\1
(a)?b\1c
将尝试匹配(a)
但失败,但由于整个组a
是可选的,正则表达式会继续,现在它会尝试查找(a)?
确定,然后b
但\1
没有匹配任何内容,甚至是空字符串,因此匹配失败。
因此,两个正则表达式之间的区别在于,在(a)?
中,捕获组捕获一个空字符串,该字符串可以在以后引用并使用(a?)
成功匹配,但\1
创建一个可选的捕获与之匹配的任何内容,因此稍后使用(a)?
引用它将始终失败,除非该组实际上与\1
匹配。
答案 2 :(得分:2)
在第一版中,括号会抓取a
,因此\1
会返回a
。
在第二个正则表达式中,括号捕获a?
,因此\1
返回a?
,表示“0或1 a
”。
由于a
在第二个正则表达式中是可选的,bc
匹配第二个正则表达式的结尾(b\1c
)