正好n次 - 组

时间:2012-07-22 09:53:56

标签: java regex

我想从带有模式的行中获取数字,但它不会按照我的意愿对数字进行分组。

public static void main(String[] args) {
    Pattern pattern = Pattern.compile("(.*?)((\\d+),{0,1}\\s*){7}");
    Scanner in = new Scanner("text: 1, 2, 3, 4, 5, 6, 7"); // new Scanner(new File("data.txt"));
    in.useDelimiter("\n");

    try {
        while(!(in.hasNext(pattern))) {
            //Skip corrupted data
            in.nextLine();
        }
    } catch(NoSuchElementException ex) {
    }
    String line = in.next();
    Matcher m = pattern.matcher(line);
    m.matches();
    int groupCount = m.groupCount();
    for(int i = 1; i <= groupCount; i++) {
        System.out.println("group(" + i + ") = " + m.group(i));
    }
}

输出:

group(1)= text:

组(2)= 7

组(3)= 7

我想得到的是:

组(2)= 1

组(3)= 2

...

组(8)= 7

我能从这种模式中得到这个吗?还是应该再制作另一种模式?

2 个答案:

答案 0 :(得分:1)

如果您只是想收集整数,可以使用Matcher.find()方法使用以下样式的模式迭代子字符串:1)可选分隔符或新行; 2)可能用空格包围的整数。您根本不必管理组索引,因为您只能引用具体的捕获组。以下解决方案除了正则表达式之外不需要任何其他内容,只需迭代char序列以查找整数:

package stackoverflow;

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

import static java.lang.System.out;
import static java.util.regex.Pattern.compile;

public final class Q11599271 {

    private Q11599271() {
    }

    //
    // (2) Let's capture an integer number only     -------------------+
    // (1) Let's assume it can start with a new     ------+            |
    //     line or a comma character                      |            |
    //                                              +-----+-----+    +-+--+
    //                                              |           |    |    |
    private static final Pattern pattern = compile("(?:^\\S+:|,)?\\s*(\\d+)\\s*");

    private static Iterable<String> getOut(CharSequence s) {
        final Collection<String> numbers = new ArrayList<String>();
        final Matcher matcher = pattern.matcher(s);
        while ( matcher.find() ) {
            numbers.add(matcher.group(1));
        }
        return numbers;
    }

    private static void display(Iterable<String> strings) {
        for ( final String s : strings ) {
            out.print(" ");
            out.print(s);
        }
        out.println();
    }

    public static void main(String[] args) {
        display(getOut("text: 1, 2, 3, 4, 5, 6, 7"));
        display(getOut("1, 2, 3, 4, 5, 6, 7"));
        display(getOut("text: 1,  22,  333   , 4444 , 55555 , 666666, 7777777"));
    }

}

这将产生以下结果:

1 2 3 4 5 6 7
1 2 3 4 5 6 7
1 22 333 4444 55555 666666 7777777

答案 1 :(得分:0)

你做不到。组始终对应于正则表达式中的捕获组。也就是说,如果您有一个捕获组,则匹配中不能有多个组。在比赛期间重复部分(甚至是捕获组)的频率是无关紧要的。表达式本身定义了最终匹配可以有多少组。