У меня только что была очень похожая проблема, и мне удалось сделать «переменное число групп», но комбинацию цикла while и сброса соответствия.
int i=0;
String m1=null, m2=null;
while(matcher.find(i) && (m1=matcher.group(1))!=null && (m2=matcher.group(2))!=null)
{
// do work on two found groups
i=matcher.end();
}
Но это для моей проблемы (с двумя повторяющимися
Pattern pattern = Pattern.compile("(?<=^ab[cd]{0,100})[cd](?=[cd]{0,100}ef$)");
Matcher matcher = pattern.matcher("abcddcef")
int i=0;
String res=null;
while(matcher.find(i) && (res=matcher.group())!=null)
{
System.out.println(res);
i=matcher.end();
}
Вы теряете возможность указывать произвольную длину повторения с помощью *
или +
, потому что упреждающий просмотр должен быть предсказуемой длины.