Java 在2个括号内匹配组
我很难让它发挥作用。我有一个字符串,比如: ((a及b)而非(c及d))或((e及f及h)而非(c及d))或((h及i)而非(k及d)) 我需要的是匹配上面的字符串并捕获两个括号((我的组))之间的文本,如: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))
- 第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-:]+))+)
- 第二级包括使用
(在java中使用matcher)捕获组。 感谢@Anubhava先生的帮助(({2}.+?){2})
(\(\(.*)\)(?:\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代码