使用正则表达式捕获字符串中的所有数字而不进行拆分

时间:2011-08-05 11:15:36

标签: java regex

我需要使用一些正则表达式来解析更复杂的文本,我想知道是否可以使用非捕获组来匹配多个数字并提取它们?我知道我可以匹配空格分隔的数字然后用空格分割它们但是我想将所有数字分成不同的组,即使我不知道它们的数量。

以下示例仅匹配最后一个数字:

----Start----
--------
i 0 11 22 4444 
i 1 4444
--------
i 0 34 56
i 1 56

但我想得到:

----Start----
--------
i 0 11 22 4444 
i 1 11
i 2 22
i 3 4444
--------
i 0 34 56
i 1 34
i 2 56

这是我的代码:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main{
    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("----Start----");

        Pattern compile = Pattern.compile("(?:(\\d+)\\s*)+");
        String s = "11 22 4444 mam a 34 56";

        Matcher matcher = compile.matcher(s);
        while(matcher.find()){
            System.out.println("--------");
            for (int i=0;i<matcher.groupCount()+1;i++){
                System.out.println("i " + i = " " + matcher.group(i));
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

你不能那样做,所以分开比赛。仅存储捕获组的最后一个值。据我所知,只有.NET正则表达式保存了以前的所有捕获。

答案 1 :(得分:0)

    matcher = compile.matcher(s);
    Pattern subCompile = Pattern.compile("(\\d+)");
    while (matcher.find()) {
        System.out.println("--------");
        Matcher subMatcher = subCompile.matcher(matcher.group());
        while (subMatcher.find())
            System.out.println(subMatcher.group());
    }

也有效。输出:

--------
11
22
4444
--------
34
56