В Java с регулярными выражениями, как захватить числа из строки с неизвестной длиной? - PullRequest
0 голосов
/ 26 апреля 2020

Мое регулярное выражение выглядит так: "[a-zA-Z]+[ \t]*(?:,[ \t]*(\\d+)[ \t]*)*"

Я могу сопоставить строки с этим, но я не знаю, как захватить числа, я думаю, что это как-то связано с группировкой.

Например: из строки "asd , 5 ,2,6 ,8", как захватить числа 5 2 6 и 8?

Еще несколько примеров:

sdfs6df -> no capture

fdg4dfg, 5 -> capture 5

fhhh3      ,     6,8    , 7 -> capture 6 8 and 7

asdasd1,4,2,7 -> capture 4 2 and 7

Так что я могу продолжить моя работа с этими числами. Заранее спасибо.

1 Ответ

1 голос
/ 26 апреля 2020

Вы можете сопоставить символы начальных слов и использовать якорь \G, фиксирующий непрерывные цифры после запятой.

Шаблон

(?:\w+|\G(?!^))\h*,\h*([0-9]+)

Объяснение

  • (?: Группа без захвата
  • \w+ Совпадение с 1 + символами слова - | или
    • \G(?!^) Утверждение сообщение в конце предыдущего матча, а не в начале
  • ) Закрыть группу без захвата
  • \h*,\h* Соответствовать запятой между горизонтальными символами пробела
  • ([0-9]+) Группа захвата 1, соответствует 1+ цифр

Regex demo | Java демо

В Java с двойными обратными слешами:

String regex = "(?:\\w+|\\G(?!^))\\h*,\\h*([0-9]+)";

Пример кода

String regex = "(?:\\w+|\\G(?!^))\\h*,\\h*([0-9]+)";
String string = "sdfs6df -> no capture\n\n"
     + "fdg4dfg, 5 -> capture 5\n\n"
     + "fhhh3      ,     6,8    , 7 -> capture 6 8 and 7\n\n"
     + "asdasd1,4,2,7 -> capture 4 2 and 7";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println(matcher.group(1));
}

Вывод

5
6
8
7
4
2
7
...