Я пытаюсь извлечь повторяющуюся часть строки с помощью регулярного выражения Java.
Моя строка: s01e04:11:08
Регулярное выражение: ^s(\\d+)e(\\d+)(:\\d+)*$
Регулярное выражение совпадает, но когда я пытаюсь извлечь третью группу, оно возвращает только последнюю ее часть.
Ожидается: :11:08
Получил: :08
Полный код:
public static void main( String args[] ) {
String marker = "s01e04:11:08";
Pattern r = Pattern.compile("^s(\\d+)e(\\d+)(:\\d+)*$");
Matcher matcher = r.matcher(marker);
if (matcher.find()) {
System.out.println(matcher.group(3));
}
}
}




Добавьте группу захвата вокруг повтора:
^s(\\d+)e(\\d+)((:\\d+)*)$
^ ^
Вы также можете сделать повторяющуюся группу не захватывающей, если вам никогда не нужно получать это само по себе:
^s(\\d+)e(\\d+)((?::\\d+)*)$
^^
Я нашел ответ. Если мы используем ^s(\\d+)e(\\d+)(:\\d+)*$ для сопоставления с s01e04, мы получим null при получении 3 группы. Если для сопоставления с s01e04:11:08 мы получим :08 - последний повторяющийся кусок группы 3. Если мы будем использовать ^s(\\d+)e(\\d+)((:\\d+)*)$, мы получим "" в первом случае и :11:08 во втором случае. Кроме того, с помощью второго выражения мы можем ссылаться на последний повторяющийся фрагмент (внутреннюю группу) группы 3 с индексом 4. И если мы хотим отключить возможность ссылаться на группу 4, мы можем использовать выражение, не захватывающее повторяющуюся группу: ^s(\\d+)e(\\d+)((?::\\d+)*)$
Ваш шаблон не соответствует 1-му ":".
Попробуйте использовать это.
("^s(\\d+)e(\\d+)((:\\d+)+)$")
(:\\d+)+ соответствует: dd один или несколько раз.
Спасибо за ответ. Как я понял, неважно, сколько включенных групп будет в одной из групп первого уровня. Или есть способ получить одну из вложенных подгрупп группы первого уровня? Что-то вроде индексации 2D-массива (
group[1][2]), не обязательно в Java.