6

这个正则表达式:

(a)?b\1c

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

(a?)b\1c

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

4

3 回答 3

6

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

在此处输入图像描述

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

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

在此处输入图像描述

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

反向引用不关心您的外部?(在第一个示例中),它只关心括号内的内容

于 2013-11-03T14:06:40.157 回答
3

这有点令人困惑,但让我们看看,我将从第二个正则表达式开始:

(a?)b\1c

当 this 尝试匹配bc时,它首先尝试(a?),但由于没有ain bc()将捕获空字符串,因此当我们稍后在字符串中使用,""引用它时,将匹配始终可能的空字符串。\1\1

现在让我们来看第二种情况:

(a)?b\1c

(a)将尝试匹配a但失败,但由于整个组(a)?是可选的,所以正则表达式继续,现在它尝试找到一个bOK,然后\1(a)? 没有匹配任何内容,即使是空字符串,所以匹配失败。

因此,这两个正则表达式之间的区别在于,在(a?)捕获组中捕获了一个空字符串,该字符串可以稍后引用并使用成功匹配\1,但(a)?会创建一个与任何内容都不匹配的可选捕获组,因此稍后使用它引用它\1总是会失败,除非该组实际上匹配了一个a.

于 2013-11-03T14:23:02.387 回答
2

在第一个版本中,括号捕获a所以\1返回a

在第二个正则表达式中,括号 catcha?所以\1返回a?,表示“0 或 1 a”。

由于a在第二个正则表达式中是可选的,bc因此很好地匹配第二个正则表达式 ( b\1c)的结尾

于 2013-11-03T14:08:25.837 回答