java RegEx中的非捕获组

时间:2017-07-21 10:47:10

标签: java regex

我编写了一段代码,但它无法正常工作。在这里你可以找到我的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

2 个答案:

答案 0 :(得分:1)

你可以用积极的前瞻来做到这一点,因为有了这个,前瞻组中的模式不包括在匹配中:

((?:Bundle\\s+Components)|(?:Included\\s+Components))\\s+(.*?)(?=Bundle)

(未经测试)

答案 1 :(得分:1)

在完全匹配中,您可以获得正则表达式所说的所有内容,甚至是非捕获组。您需要获得适当的匹配以摆脱非捕获组。另一种解决方案是使用正向前瞻而不是捕获组。检查下面的正则表达式。我还删除了一些不必要的(IMO)组。

(?:Bundle\s+Components|Included\s+Components)\s+.*?(?=Bundle)

结果只有一个完整的匹配。

Demo

PS:此解决方案中也将捕获“Bundle”之前新行的符号。