匹配 2 个括号内的组

Match groups inside 2 parenthesis

我很难让它发挥作用。我有一个像这样的字符串:

((a 和 b) 而不是 (c 和 d)) 或 ((e 和 f 和 h) 而不是 (c 和 d)) 或 ((h 和 i) 而不是 (k 和 d) ) ......

我需要的是匹配上面的字符串并捕获每两个括号((我的组))之间的文本,例如:

并用 'or' 运算符分隔。

这是我的正则表达式:

(\({2}.+?\){2})(?: (?:or) (\({2}.+?\){2}))+

当我单独使用时,我的正则表达式 (\({2}.+?\){2}) 的第一部分匹配两个括号之间的所有组。但是当我添加第二部分以匹配由 'or' (?:or) (\({2}.+?\){2}))+ 分隔的所有组时它不起作用 - 它似乎匹配下面的文本是不充分的:

((a and b) and not (c and d)) and ((a and b) and not (c and d)).

感谢您的帮助

您可以在 Java:

中使用此正则表达式
(?:^|(?!^)\G\h+or\h+)(\(\((?:(?!\)\)).)++\)\))(?=(?:\h+or\h+\(\((?:(?!\)\)).)++\)\))*$)

RegEx Demo

正则表达式详细信息:

  • (?:: 启动一个非捕获组
    • ^:匹配开始位置
    • |: 或
    • \G\h+or\h+:从上一场比赛结束开始,比赛or被1+个空格包围
  • ):结束非捕获组
  • (: 开始捕获组#1
  • \(\(: 比赛开始 ((
    • (?:(?!\)\)).)++:匹配任何字符的 1+,只要它前面没有 ))++ 是所有格量词
    • \)\):比赛结束))
  • ): 结束捕获组#1
  • (?=\h+or\h+|$):先行断言我们有一个用空格包围的 or 或字符串结尾

我将问题分为两个级别。

  • 第一级包括使用此正则表达式验证文本:

(?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))(?: or (?:((?:([A-Za-z0-9-: ]+)|([A-Za-z0-9-: ]+) and not ([A-Za-z0-9-: ]+)))))+)

  • 第二级包括使用 (({2}.+?){2}) 捕获组(使用 java 中的匹配器)。 谢谢@Anubhava 先生的帮助。

使用两种模式:

  • 组模式:((\()|(|\) and|\) or|\))|([a-z ]+)))
    • 第 1 组:打开你的深度
    • 第 2 组:关闭你的深度
    • 第 3 组:规格
      • 规范模式:((?: )(a|b|c) (and|or|))
        • 第 1 组:句子
        • 第 2 组:运算符