非捕获组正则表达式不适用于Java

时间:2014-09-22 11:24:37

标签: java regex

在线REGEX测试仪显示非捕获组被忽略但是从java代码中它不会被忽略。

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Pattern PATTERN = Pattern.compile("(?:execute: ID: \\[\\s)([0-9]*)(?:\\s\\])");
        Matcher matcher = PATTERN.matcher("controllers.pring execute: ID: [ 290825814 ] executing bean: [ strong ]");
        if (matcher.find()) {
            System.out.println(matcher.group(0));
        }
    }
}

输出

execute: ID: [ 290825814 ]

预期

290825814

2 个答案:

答案 0 :(得分:8)

这是错误的假设,因为matcher.group(0)总是通过最新的findmatches方法返回完整匹配的文字。

要获得290825814,您必须使用:

Pattern PATTERN = Pattern.compile("(?:execute: ID: \\[\\s)([0-9]*)(?:\\s\\])");
Matcher matcher = PATTERN.matcher("controllers.pring execute: ID: [ 290825814 ] executing bean: [ strong ]");
if (matcher.find()) {
    System.out.println(matcher.group(1)); // 290825814
}

答案 1 :(得分:2)

来自Matcher documentation

  

捕获组从左到右编制索引,从1开始。组零表示整个模式,因此表达式m.group(0)等同于m.group()。

因为您正在使用组0,所以您正在捕获整个模式,巧合地与非捕获组相同。我不确定为什么你把整个模式包装在一个非捕获组中。