【问题标题】:How to regex match pairs within pairs如何在对中正则表达式匹配对
【发布时间】:2012-10-26 23:45:15
【问题描述】:

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

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

其他信息:

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

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

AzzAyyAxxxxByyBzzB
Here is some unrelated stuff
AzzAyyAxxxxByyBzzB
AzzzBxxArrrBAssssB

顶部的AB 对需要与底部的AB 对分开

【问题讨论】:

    标签: java regex


    【解决方案1】:

    您使用? 使您的正则表达式明确不贪婪。只需将其忽略,正则表达式将在匹配 B 之前尽可能多地消耗:

    (A(.*)B)
    

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

    AxxxByyyAzzzB
    

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

    编辑:

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

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

    A([^AB]*)B
    

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

    【讨论】:

    • 完美的解决方案,不幸的是我应该提到另一个约束。请看编辑。对不起!
    • @kentcdodds 实际上我已经将其编辑到我的答案中;)。那些“平行”的A...B 对总是只出现在不同的行上吗?或者一行中可能有多个连续的对?
    • @kentcdodds 您使用哪种语言或工具?一些正则表达式引擎支持简单的递归,这可能会对您有所帮助。
    • @kentcdodds 不,据我所知,Java 不支持它。我的另一个问题呢?
    • @kentcdodds 那么这对于正则表达式是不可能的。但是,您可以使用A([^AB]*)B 从内到外进行匹配。这只会得到最里面的对。然后您可以删除它们并找到下一个匹配项。
    【解决方案2】:

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

    \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
    

    【讨论】:

      【解决方案3】:

      您无法单独使用正则表达式来做到这一点。你所描述的更多的是Context-Free而不是Regular。为了解析这样的内容,每次遇到“A”时都需要将新上下文推送到堆栈上,并在每次遇到“B”时弹出堆栈。您需要更多类似于pushdown automaton 的东西,而不是正则表达式。

      【讨论】:

      • 有一些正则表达式实现可以解决给定的问题(例如 PCRE)。通常,几乎所有常见的正则表达式引擎都通过允许反向引用和环视来推动“正则表达式”的含义。当然,从理论上讲,我完全同意你的观点,即使有一些正则表达式引擎可以处理这个问题,它肯定永远不会是一个优雅的解决方案。但是,我虽然值得指出...
      • @m.buettner - 我很好奇:反向引用怎么不规则?它们看起来像是与匹配和捕获组有关的实现细节,但我认为它们不会影响语言的“规则性”。
      • @m.buettner - 抱歉;反向引用显然不正常。我的意思是说“环视如何不规则”
      • 哦,我猜是you're right
      猜你喜欢
      • 2013-11-18
      • 1970-01-01
      • 2023-01-20
      • 2011-03-27
      • 2023-01-23
      • 2023-03-22
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      相关资源
      最近更新 更多