Java 在2个括号内匹配组

Java 在2个括号内匹配组,java,regex,match,Java,Regex,Match,我很难让它发挥作用。我有一个字符串,比如: ((a及b)而非(c及d))或((e及f及h)而非(c及d))或((h及i)而非(k及d)) 我需要的是匹配上面的字符串并捕获两个括号((我的组))之间的文本,如: 第一组:((a和b)而不是(c和d)) 第2组:((e、f和h)而不是(c和d)) 第3组:(c和d)或(h和i)而非(k和d)) 并用“或”运算符分隔 这是我的正则表达式: (\({2}.+?\){2})(?: (?:or) (\({2}.+?\){2}))+ 我的正则表达式的第一

我很难让它发挥作用。我有一个字符串,比如:

((a及b)而非(c及d))或((e及f及h)而非(c及d))或((h及i)而非(k及d))

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

  • 第一组:((a和b)而不是(c和d))
  • 第2组:((e、f和h)而不是(c和d))
  • 第3组:(c和d)或(h和i)而非(k和d))
并用“或”运算符分隔

这是我的正则表达式:

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

((a和b)而不是(c和d))和((a和b)而不是(c和d))


感谢您的帮助

您可以在Java中使用此正则表达式:

(?:^(?!^)\G\h+或\h+(\((?:(?!\))++\)(?=(?:\h+或\h+\(\((?:(!)\)++\))*$)

正则表达式详细信息:

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

我将问题分为两个层次

  • 第一级包括使用以下正则表达式验证文本:
(?:(?:([A-Za-z0-9-:]+)|([A-Za-z0-9-:]+)和非([A-Za-z0-9-:]+)(?:(?:([A-Za-z0-9-:]+)([A-Za-z0-9-:]+)和非([A-Za-z0-9-:]+))+)

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

您可以尝试
(\(\(.*)\)(?:\h+或\h+|$)
谢谢您的回复,但我的问题是关于“或”运算符,我需要匹配所有字符串,然后捕获组。如果全文不匹配,则无需分组。它不起作用+它给出了3个匹配项和一个分组,而我需要的是获得1个匹配项并捕获三个分组(由“或”分隔,在您的提议中没有考虑到)。无论如何,谢谢您。您可能不知道您不能单独获得重复的分组。一定要读一下。看看这个演示:我有这些没有
的捕获组。我感谢你为帮助我所做的一切努力。我的目标是验证这个文本(这个字符串):((a和b)而不是(c和d))或者((a和b)而不是(c和d))或者((a和b)而不是(c和d)),然后捕获组。因此,您提供给我的正则表达式不执行验证步骤。换句话说,“myString”。匹配((?:^\\\G\\h+或\\h+)(\((?:(!\)\)++\)\)(?=\\h+或\\h+\$)给了我False。你错了。上面的正则表达式确实进行了验证:
((a和b)而不是(c和d))或者((a和b)而不是(c和d))或者((a和b)而不是(c和d))
正如您在这里看到的:它匹配三个部分而不是一个,当我使用mystring.match(您的正则表达式)遍历java时,它给出了false。我想这是因为你的正则表达式提供了3场比赛,而不是一场。虽然我希望有一个单一的匹配,但捕获了几个组(在括号中)。我分两部分来做这件事,因为似乎没有其他方法来做。这两部分是非常低效的方法,特别是当输入是一个大字符串时。我提供的这个正则表达式不适用于
.match
。您必须将它与
模式
匹配器
以及
查找()方法一起使用。在我提供的链接中有一个示例Java代码