Pessoal
Estou tentando iterar sobre resultados de uma expressão regular no Java, mas a API não me proporciona algo para isso !
Ex: A API me oferece uma forma de iterar sobre os grupos retornados, já que há o método Matcher.groupCount(). MAS a API não me oferece nada do tipo Matcher.matchesCount(). E o que ela me oferece ( Pattern.split e Matcher.find ) não sei se estou usando errado ou se não servem para o que eu quero !
Demonstração do “resultado” pretendido:
Match1:
… grupo1 - 01
… grupo2 - xxxx-xxxx-xxxx-xxxx
Match2:
… grupo1 - 02
… grupo2 - yyyy-yyyy-yyyy-yyyy
Abaixo, as partes do código que importam:
1 (tentando usar Pattern.split) :
String response = " General_Result=OK Product=<produto01> LicenseCode=xxxx-xxxx-xxxx-xxxx Product=<produto02> LicenseCode=yyyy-yyyy-yyyy-yyyy ";
regularExpression = ".*?[Ppr]oduct\\s*=\\s*[\\<\\-\\w]{4,9}([\\d]{1,3}).*?[lL]icense[cC]ode\\s*=\\s*([\\d\\-\\w]{4,20}).*?";
regexPattern = Pattern.compile(regularExpression, Pattern.DOTALL);
String[] regexMatches = regexPattern.split(response);
for (int i = 0; i < regexMatches.length; i++) {
regexMatcher = regexPattern.matcher(regexMatches[i]);
if (regexMatcher.matches()) {
int productId = Integer.parseInt(regexMatcher.group(1));
String licenseCode = regexMatcher.group(2);
ServicesType[] servicesCodes = getServicesCodesByProductId(productId);
licensesMap.put(licenseCode, servicesCodes);
}
}
[color=red]Problema: o String array retornado do split vem com 3 resultados vazio ("").[/color]
2 (tentando usar Matcher.find):
String response = " General_Result=OK Product=<produto01> LicenseCode=xxxx-xxxx-xxxx-xxxx Product=<produto02> LicenseCode=yyyy-yyyy-yyyy-yyyy ";
regularExpression = ".*?[Ppr]oduct\\s*=\\s*[\\<\\-\\w]{4,9}([\\d]{1,3}).*?[lL]icense[cC]ode\\s*=\\s*([\\d\\-\\w]{4,20}).*?";
regexPattern = Pattern.compile(regularExpression, Pattern.DOTALL);
regexMatcher = regexPattern.matcher(response);
if (regexMatcher.matches()) {
while (regexMatcher.find()) {
int productId = Integer.parseInt(regexMatcher.group(1));
String licenseCode = regexMatcher.group(2);
}
}
[color=red]Problema: ao atingir o “while ()”, sai da condição direto.[/color]regexMatcher.find()
[color=darkblue]3 - acabei de tentar tambem vendo se o java trata os matches como grupos. Por ex: Eu estava esperando 2 matches cada um com 2 grupos. Se o que estava pensando acontecesse eu deveria ter 4 grupos em Matcher.groupCount() . Mas só tenho 2 mesmo ( o que significa que estou no primeiro match ). Este primeiro match por sinal, funciona perfeitamente; MAS COMO EU FAÇO PARA ITERAR PARA O PRÓXIMO MATCH ???[/color]
.