让我好奇的是
[ab]*不重复匹配的部分,而是重复[ab]。换句话说,为什么它与a*或b*不一样?([ab])\1重复匹配的部分,而不重复[ab]。换句话说,为什么它只能与aa和bb相匹配,而不能与ab和ba匹配?这是因为()的优先级低于[],而*的优先级高于[]?我不知道我是否认为这些操作人员是不合适的。谢谢。
发布于 2014-06-07 03:07:27
两者是完全不同的。
当您说[ab]*时,它意味着a或b为零或更多次。因此,它将匹配"“、"a”、"b“以及a和b的任何组合。
但是([ab])\1意味着a或b将被匹配,然后被捕获。\1被称为反向引用。它指的是RegEx中已经捕获的组。在我们的例子中,([ab])。因此,如果捕获了a,那么它将再次只匹配a。如果它是b,那么它将再次匹配b。它只能匹配aa和bb。
发布于 2014-06-07 03:07:55
[ab]*这也不匹配任何东西,a、b、aaa、bbb和任何长度的字符串。匹配不受长度限制,并且由于没有捕获组,所以它的语句匹配由所有a和b字符组成的任意长度的字符串。
([ab])\1在这种情况下,它强制匹配的字符串为两个字符,因为没有重复。首先,它必须匹配父类内部的内容(对于捕获第一组),然后它必须匹配它在第1组中捕获的内容,这意味着匹配必须是两个字符长,两个字符是相同的。
发布于 2014-06-07 03:39:53
让我们看看您的每个表达式,然后我们将添加一个有趣的扭曲,这可能解决任何悬而未决的混乱。
[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]*匹配
https://stackoverflow.com/questions/24093235
复制相似问题