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或1a
”
由于
a
在第二个正则表达式中是可选的,bc
很好地匹配了第二个正则表达式的结尾(b\1c
),这有点让人困惑,但让我们看看,我将从第二个正则表达式开始:
(a?)b\1c
当它尝试匹配bc
时,它首先尝试(a?
,但由于bc
中没有a
,()
将捕获空字符串”
,因此当我们稍后使用\1
在字符串中引用它时,\1
将匹配总是可能的空字符串
现在我们来看第二种情况:
(a)?b\1c
(a)
将尝试匹配a
但失败,但由于整个组(a)
是可选的,正则表达式继续,现在它尝试查找ab
确定,然后\1
但(a)
没有匹配任何内容,即使是空字符串,匹配也失败
因此,这两个正则表达式之间的区别在于,在
(a?
中,捕获组捕获一个空字符串,稍后可以引用该字符串,并使用\1
成功匹配,但是(a)?
创建了一个可选的捕获组,该组与任何内容都不匹配,因此以后使用\1
引用该组将始终失败,除非该组与a
实际匹配。您是如何创建此图片的?祝贺您,您在漂亮图片方面比我快:)感谢Regeper,我将此网站添加为书签。感谢您的澄清,就在第二个示例中,我认为“bac”不会匹配,但“abac”会匹配。@daremarkovic您是对的,我完全忘记了第一组!(答案已编辑)