正则表达式混乱 - ?括号内外

时间:2013-11-03 14:02:03

标签: regex

这个正则表达式:

(a)?b\1c

与“bc”不匹配,而这一个:

(a?)b\1c

确实匹配它。为什么是这样?我认为这些陈述是完全相同的。

3 个答案:

答案 0 :(得分:6)

在您的第一个示例(a)?b\1c中,\1指的是您的(a)群组,这意味着您必须拥有a

enter image description here

  • abac将匹配
  • bac将匹配
  • bc将不匹配

在您的第二个示例(a?)b\1c中,\1引用(a?),其中a是可选的:

enter image description here

  • 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