2

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

4

1 回答 1

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

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

捕获组(A(?:[^AB]*|(?-1))B)匹配A开头的 a 和B结尾的 a。在这两者之间,可能有任意数量的非(AB)字符,或者第一个捕获组的模式可能在此位置((?-1))递归匹配。这保证了As 和Bs 是平衡的。

于 2012-12-14T17:32:25.543 回答