使用正则表达式匹配相同长度的子字符串

时间:2012-12-14 17:22:22

标签: regex perl

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

1 个答案:

答案 0 :(得分: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平衡。