Java Regex: повторяющиеся группы? - PullRequest
2 голосов
/ 07 апреля 2020

Как определить повторяющиеся группы в Java Regex?

Допустим, 2di git число [0-9] {2} несколько раз отделяется на

12,34,98,11

Это возможно или разделение, единственный шанс?

Редактировать: Мне нравится проверять И извлекать.

Ответы [ 3 ]

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

В Java вы также можете использовать Scanner API для этого:

final Pattern pat = Pattern.compile("\\d{2}");
Scanner scan = new Scanner("12,34,98,11");
scan.useDelimiter(",");
while(scan.hasNext(pat)) {
    System.out.println( "Token: " + scan.next() );
}
scan.close();
1 голос
/ 07 апреля 2020

Это поддерживается в Java Regex. См. Документация по шаблону . Вот пример:

"11,12,13".matches("\\d{2}(,\\d{2})*"); // true

Затем можно разделить строку с помощью String.split () , Scanner или StringTokenizer . Примеры:

String[] split = "11,12,13".split(",");
StringTokenizer stringTokenizer = new StringTokenizer("11,12,13", ",");
Scanner scanner = new Scanner("11,12,13").useDelimiter(",");
while (scanner.hasNext()) {
    // scanner.next()
}
0 голосов
/ 07 апреля 2020

Самый простой способ - использовать двухэтапное решение: 1) сначала проверьте строку, затем 2) разбейте строку с помощью выбранного вами разделителя:

String[] chunks = null;
if (s.matches("\\d{2}(?:,\\d{2})*")) {
    chunks = s.split(Pattern.quote(","));
    System.out.println(Arrays.toString(chunks)); // => [12, 34, 98, 11]
}

Здесь s.matches("\\d{2}(?:,\\d{2})*") соответствует всей строке, которая начинается с двух цифр, а затем содержит 0 или более вхождений , и двух цифр до конца, а затем s.split(Pattern.quote(",")) разделяет строку запятой. Обратите внимание, что вам не нужны якоря ^ и $ с шаблоном внутри matches(), поскольку метод требует полного совпадения строк.

Если вам нужно сделать это с одним регулярным выражением , вы можете использовать несколько совпадений, привязанных к началу строки и концу каждого успешного предыдущего совпадения, только если проверка строки в начале строки прошла успешно:

(?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$))(\d{2})

См. regex demo .

Подробности

  • (?:\G(?!^),|^(?=\d{2}(?:,\d{2})*$)) - конец предыдущего успешного матча и затем , (см. \G(?!^),) или (|) начало строки (^), за которой следуют две цифры, а затем 0 или более последовательностей , и двух цифр до конца строки (см. \d{2}(?:,\d{2})*$)
  • (\d{2}) - Группа 1: две цифры

Java демо :

String s = "12,34,98,11";
Pattern p = Pattern.compile("(?:\\G(?!^),|^(?=\\d{2}(?:,\\d{2})*$))(\\d{2})");
Matcher m = p.matcher(s);
List<String> results = new ArrayList<>();
while(m.find()) {
    results.add(m.group(1));
}
System.out.println(results); 
// => [12, 34, 98, 11]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...