2012-12-14 46 views
2

我有类似于找到“匹配括号”的挑战,但我想这是一个更简单的挑战。 例如,像“xAAAyBBBz”这样的字符串应该匹配,因为有3个A和3个B。然而,“xAAyBBBz”不应该匹配,因为有一个“不匹配的”B.字符串具有任意长度,并且它应该是一个单一的正则表达式。我可以使用in-regexp评估(毕竟是Perl),我可以(应该!)完全避免使用正则表达式。但现在我很好奇。使用正则表达式匹配相同长度的子串

+2

如果x,y或z包含A或B会怎么样? – melpomene

+0

您描述的模式与传统正则表达式不匹配,因为该模式不是常规语言(http://en.wikipedia.org/wiki/Regular_language)。但是,它可能通过扩展匹配。 –

+0

我相信[先前提出的问题](http://stackoverflow.com/questions/7434272/match-an-bn-cn-e-g-aaabbbccc-using-regular-expressions-pcre)回答你的问题。 :) –

回答

1
^[^AB]*(A(?:[^AB]*|(?-1))B)[^AB]*\z 

^ 
[^AB]*  # "x" 
(
    A 
    (?: 
    [^AB]* # "y" 
    | 
    (?-1) 
) 
    B 
) 
[^AB]*  # "z" 
\z 

捕获组(A(?:[^AB]*|(?-1))B)相匹配的A在开始和一个B末。在中间,可能有任何数量的非(AB)字符,或者第一个捕获组的图案可能会在此位置递归匹配((?-1))。这保证了AB均衡。

+0

也许你应该解释你的正则表达式。 – TLP

+0

@TLP什么不清楚? – melpomene

+0

如果As和Bs是连续的,但是我不确定情况总是如此。如果不需要,只需扩展包含外部“'[^ AB] *'”。 – ikegami

相关问题