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

Regex 正则表达式混乱-?括号内外,regex,Regex,此正则表达式: (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将匹配 back引用不关心外部?(在第一个示例中),它只关心括号内的内容在第一个版本中,括号捕捉a,因此\1返回a 在第二个正则

此正则表达式:

(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
    将匹配

back引用不关心外部
(在第一个示例中),它只关心括号内的内容在第一个版本中,括号捕捉
a
,因此
\1
返回
a

在第二个正则表达式中,括号捕捉
a?
so
\1
返回
a?
,表示“0或1
a


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

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

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

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

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


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

实际匹配。您是如何创建此图片的?祝贺您,您在漂亮图片方面比我快:)感谢Regeper,我将此网站添加为书签。感谢您的澄清,就在第二个示例中,我认为“bac”不会匹配,但“abac”会匹配。@daremarkovic您是对的,我完全忘记了第一组!(答案已编辑)