Je dois analyser une chaîne et de capturer certaines valeurs:Cette RegEx capture un nombre incorrect de groupes
FREQ = HEBDOMADAIRE; WKST = MO; BYDAY = 2TU, 2WE
Je veux capturer 2 groupes:
grp 1: 2, 2
grp 2: TU, WE
Les nombres représentent des intervalles. TU, WE représente les jours de la semaine. J'ai besoin des deux.
Je suis en utilisant ce code:
private final static java.util.regex.Pattern regBYDAY = java.util.regex.Pattern.compile(".*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?)*.*");
String rrule = "FREQ=WEEKLY;WKST=MO;BYDAY=2TU,2WE";
java.util.regex.Matcher result = regBYDAY.matcher(rrule);
if (result.matches())
{
int grpCount = result.groupCount();
for (int i = 1; i < grpCount; i++)
{
String g = result.group(i);
...
}
}
grpcount == 2 - pourquoi? Si je lis correctement la documentation de Java (ce petit peu) je devrais obtenir 5? 0 = l'expression entière, 1,2,3,4 = mes captures 2,2, TU et WE.
résultat.group (1) == "2";
Je suis un programmeur C# avec très peu d'expérience java donc j'ai testé le RegEx dans le "Regular Expression Workbench" - un excellent programme C# pour tester RegEx. Là mon RegEx fonctionne bien.
https://code.msdn.microsoft.com/RegexWorkbench
RegExWB:
.*;BYDAY=(?:([+-]?[0-9]*)([A-Z]{2}),?)*.*
Matching:
FREQ=WEEKLY;WKST=MO;BYDAY=22TU,-2WE,+223FR
1 => 22
1 => -2
1 => +223
2 => TU
2 => WE
2 => FR
Je ne suis pas sûr de ce que les outils sont disponibles en Java pour faire ce dont vous avez besoin, mais un indice est que votre regex n'a que 2 groupes de capture: '([+ -]? [0-9] *)' et '([AZ] {2})' – Johrn
Oui - c'est vrai. Un pour Interval, un pour Weekday. En C# (.net) quand une regex a plus de hits, j'obtiens un tableau de résultats dans mon groupe de capture. Comme dans l'exemple RegExWB. Le groupe 1 a trois visites, le groupe 2 aussi. Est-ce aussi possible avec Java? – Arthur