2

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

AzzAyyAxxxxByyBzzB

所以通常我想得到和之间的A一切B。但是,由于第一个A和最后一个B(一对)之间的某些内容包含额外AB的对,我需要推迟比赛的结束。(不确定最后一部分是否有意义)。

所以我正在寻找的是一些正则表达式,它可以让我得到以下输出:

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 中完成,但我想在我放弃它并尝试其他方法之前,我会询问你们中的一些 regex 向导。谢谢!

附加信息:

我正在进行的项目是用 Java 编写的。

另一个问题是我正在解析一个可能包含以下内容的文档:

AzzAyyAxxxxByyBzzB
Here is some unrelated stuff
AzzAyyAxxxxByyBzzB
AzzzBxxArrrBAssssB

并且顶部对需要与底部对AB分开AB

4

3 回答 3

2

您使用?. 只需将其排除在外,正则表达式将在匹配之前尽可能多地消耗B

(A(.*)B)

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

AxxxByyyAzzzB

您现在还可以从第一个匹配A到最后一个B。如果这在您的场景中是可能的,您最好自己逐个字符地遍历字符串并计算As 和Bs 以确定哪些属于一起。

编辑:

现在您已经更新了问题并且我们在评论中发现了这一点,您确实遇到了多个连续对的问题。在这种情况下,这不能使用不支持递归的正则表达式引擎来完成。

但是,您可以从内到外切换到匹配。

A([^AB]*)B

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

于 2012-11-06T23:13:36.237 回答
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
于 2012-11-06T23:18:09.050 回答
0

您将无法仅使用正则表达式来做到这一点。您所描述的内容比Regular更无上下文。为了解析这样的内容,您需要每次遇到“A”时将新上下文推送到堆栈上,并在每次遇到“B”时弹出堆栈。您需要的东西更像是一个下推自动机,而不是正则表达式。

于 2012-11-06T23:31:19.263 回答