如何在对中匹配正则表达式

时间:2012-11-06 23:11:05

标签: java regex

我的问题相当简单,即使它所服务的目的非常复杂。我将使用一个简单的例子:

AzzAyyAxxxxByyBzzB

通常情况下,我希望获得AB之间的所有内容。但是,由于第一个A和最后一个B(一对)之间的某些内容包含额外的AB对,我需要推回匹配的结尾。 (不确定最后一部分是否有意义。)

所以我正在寻找的是一些可以让我拥有以下输出的RegEx:

Match 1
  Group 1: AzzAyyAxxxxByyBzzB
  Group 2: zzAyyAxxxxByyBzz

然后我会再次匹配得到:

Match 2
  Group 1: AyyAxxxxByyB
  Group 2: yyAxxxxByy

然后终于再次得到:

Match 3
  Group 1: AxxxxB
  Group 2: xxxx

显然,如果我在整个输入上尝试(A(.*?)B),我会得到:

Match x
  Group 1: AzzAyyAxxxxB
  Group 2: zzAyyAxxxx

这不是我想要的:)

我希望这是有道理的。我知道如果在RegEx中无法做到这一点,但我想在我放弃它并尝试其他方法之前我会问你们一些正则表达式向导。谢谢!

其他信息:

我正在研究的项目是用Java编写的。

另一个问题是我正在解析一个可能包含这样的文档:

AzzAyyAxxxxByyBzzB
Here is some unrelated stuff
AzzAyyAxxxxByyBzzB
AzzzBxxArrrBAssssB

AB对需要与底部AB

分开

3 个答案:

答案 0 :(得分:1)

您使用?明确地表达了您的正则表达式。在匹配B

之前,只需将其保留,正则表达式将尽可能多地使用
(A(.*)B)

但是,通常嵌套结构超出了正则表达式的范围。在这种情况下:

AxxxByyyAzzzB

您现在也会从第一个A到最后一个B进行匹配。如果在您的方案中可以实现这一点,那么您可能最好逐个字符地查看字符串并计算AB以确定哪些属于一起。

修改

现在你已经更新了问题,我们在评论中发现了这一点,你有多个连续对的问题。在这种情况下,使用不支持递归的正则表达式引擎无法做到这一点。

但是你可以从里到外切换到匹配。

A([^AB]*)B

这只会得到最里面的对,因为在分隔符之间既不能有A也不能有B。如果您找到它,则可以删除该对并继续下一场比赛。

答案 1 :(得分:0)

如果使用多线模式,请使用单词边界:

\bA(.*)B\b  #for matches that does not start from beginning of line to end

^A(.*)B$    #for matches that start from beginning of line till end

答案 2 :(得分:0)

单独使用正则表达式,您无法做到这一点。您所描述的内容比Context-Free更多Regular。为了解析这样的事情,你需要每次都要将一个新的上下文推到一个堆栈上,以便遇到一个' A'每当你遇到一个' B'然后弹出堆栈。你需要更像pushdown automaton而不是正则表达式的东西。