java - 恰好 n 次 - 组

标签 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));
    }
}

输出:

组(1) = 文本:

组(2) = 7

组(3) = 7

我想要得到的是:

组(2) = 1

组(3) = 2

...

组(8) = 7

我可以从这个图案中得到这个还是我应该制作另一个图案?

最佳答案

如果您只想收集整数,则可以使用 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

关于java - 恰好 n 次 - 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11599271/

相关文章:

java - Drools Fusion 持续时间和时间戳,为什么不起作用?

java - 如何使用枚举而不每次都指定枚举类?

javascript - 使用正则表达式从字符串中检索电话号码

ruby - 正则表达式以匹配最后一次出现

java - 在postgreSQL驱动程序中打印PreparedStatement

java - HTTP SOAP 负载编码

java - 如何在Jmeter beanshell处理器中生成timeuuid?

java - 使用java正则表达式查找没有宽度或高度属性的img标签

php - 在 PHP 中用另一个符号替换反斜杠

java - Intellij 想法 : How do I create custom Inspection rule with regexp