我编写了一段代码,但它无法正常工作。在这里你可以找到我的RegEx
,我有什么作为输入和我期望的输出。我正在使用非捕获组,因为我想读取文本,但我得到“Bundle”字样,但我不想将其包含在捕获的字中。但是我不知道我做错了什么导致它不起作用。
这是我的代码:
Pattern pattern = Pattern.compile(
"((Bundle\\s+Components)|(Included\\s+Components))\\s+(.*?)(?:Bundle)", Pattern.DOTALL);
Matcher matcher = pattern.matcher(tableInformation);
while (matcher.find()) {
String bundleComponents = matcher.group();
System.out.println(bundleComponents);
}
以下是示例: 例1:
Bundle Components bla blah\blabla?!()\\ANY CHARACTER IS POSSIBLE HERE, EVEN LINEBREAK,blah blah
Bundle Type
示例2:
Included Components
blah blah, like above,
Bundle Type
输出我期待Ex。 1:
Bundle Components bla blah\blabla?!()\\ANY CHARACTER IS POSSIBLE HERE, EVEN LINEBREAK,blah blah
输出我期待Ex。 2:
Included Components
blah blah, like above,
我得到的作为Ex的输出。 2:
Bundle Components bla blah\blabla?!()\\ANY CHARACTER IS POSSIBLE HERE, EVEN LINEBREAK,blah blah
Bundle Type
我得到的作为Ex的输出。 2:
Included Components
blah blah, like above,
Bundle Type
答案 0 :(得分:1)
你可以用积极的前瞻来做到这一点,因为有了这个,前瞻组中的模式不包括在匹配中:
((?:Bundle\\s+Components)|(?:Included\\s+Components))\\s+(.*?)(?=Bundle)
(未经测试)
答案 1 :(得分:1)
在完全匹配中,您可以获得正则表达式所说的所有内容,甚至是非捕获组。您需要获得适当的匹配以摆脱非捕获组。另一种解决方案是使用正向前瞻而不是捕获组。检查下面的正则表达式。我还删除了一些不必要的(IMO)组。
(?:Bundle\s+Components|Included\s+Components)\s+.*?(?=Bundle)
结果只有一个完整的匹配。
PS:此解决方案中也将捕获“Bundle”之前新行的符号。