令我惊讶的是
为什么[ab]*
不重复匹配的部分,但重复[ab]
。换句话说,为什么它与a*
或b*
不一样?
为什么([ab])\1
重复匹配的部分,但不重复[ab]
。换句话说,为什么它只能匹配aa
和bb
,而不能匹配ab
和ba
?
是因为()
的优先级低于[]
,而*
的优先级高于[]
?我想知道这些因为运营商可能不合适。感谢。
答案 0 :(得分:1)
它们两者完全不同。
当您说[ab]*
时,它表示a
或b
为零或更多次。因此,它会匹配""," a"," b"以及a
和b
的任意组合。
但([ab])\1
表示a
或b
会匹配,然后会被捕获。 \1
称为反向引用。它指的是RegEx中已经捕获的组。在我们的案例中,([ab])
。因此,如果捕获了a
,那么它将仅再次匹配a
。如果是b
,那么它将仅再次与b
匹配。它只能与aa
和bb
匹配。
答案 1 :(得分:1)
[ab]*
这也不会匹配任何内容,a
,b
,aaa
,bbb
以及任意长度的字符串。匹配不受长度约束,并且由于没有捕获组,因此它表示匹配由所有a
和b
字符组成的任意长度的字符串。
([ab])\1
在这种情况下,它会强制匹配的字符串为两个字符,因为没有重复。首先,它必须与parens中的内容相匹配(用于捕获第一组),然后它必须与第1组中捕获的内容匹配,这会隐式强制匹配为两个字符长,两个字符相同。
答案 2 :(得分:1)
让我们看看你的每个表达,然后我们将添加一个有趣的转折,这可能解决任何悬而未决的混乱。
[ab]*
相当于(?:a|b)*
,换句话说,匹配a
或b
任意次,例如abbbaab
。
[ab]
相当于(?:a|b)
,换句话说,匹配a
或b
一次,例如a
。
a*
表示任意次数匹配a
(例如,aaaa
b*
表示任意次数匹配b
(例如,bb
您说([ab])\1
只能与aa
或bb
匹配。这是正确的,因为
([ab])\1
表示匹配a
或b
一次,将其捕获到第1组,然后再次匹配第1组,即a
,如果我们有a
,或b
如果我们有b
。
另一种变体(Perl,PCRE)
([ab])(?1)
表示匹配a
或b
一次,将其捕获到组1,然后匹配组1中指定的表达式,因此再次匹配[ab]
。这将匹配aa
,ab
,ba
或bb
。因此,
([ab])(?1)*
可以与[ab]+
匹配,([ab]*)(?1)*
可以与[ab]*
匹配