Захват всех чисел из строки с помощью регулярных выражений без разбиения - PullRequest
0 голосов
/ 05 августа 2011

Мне нужно использовать некоторые регулярные выражения для разбора более сложного текста, и мне интересно, можно ли использовать группы без захвата для сопоставления нескольких чисел и их извлечения? Я понимаю, что могу сопоставить числа, разделенные пробелами, а затем разделить их на пробелы, но мне бы хотелось получить все числа в разных группах, даже если я не знаю их количество.

Пример ниже соответствует только последнему номеру:

----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 ]

1 голос
/ 05 августа 2011

Вы не можете этого сделать, поэтому разделите матч.Сохраняется только последнее значение группы захвата.Насколько я знаю, только .NET Regex сохраняет все предыдущие записи.

0 голосов
/ 05 августа 2011
    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...