Solution :
(regardez aussi la modification que j'ai faite à la fin de ma réponse)
"\\b(\\d{1,3})([a-z]{1,3})(?=,*|\\b)"
Exemple :
String s = "1a, 12a, 1ab, 12ab, 123a, 123abc";
Pattern p = Pattern.compile("\\b(\\d{1,3})([a-z]{1,3})(?=,*|\\b)");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println("Group: "+ m.group() + ", letters: " + m.group(1) + ", digits: " + m.group(2));
}
Sortie que vous obtenez :
Group: 1a, letters: 1, digits: a
Group: 12a, letters: 12, digits: a
Group: 1ab, letters: 1, digits: ab
Group: 12ab, letters: 12, digits: ab
Group: 123a, letters: 123, digits: a
Group: 123abc, letters: 123, digits: abc
Explication :
\\b(\\d{1,3})([a-z]{1,3})(?=,*|\\b)
toute la regex
\\b
- limite des mots
\\d{1,3}
- chiffre, de une à trois fois
[a-z]{1,3}
- personnages de a
à z
de une à trois fois
(?=,*|\\b)
- c'est une anticipation positive, vous dites qu'après ces lettres vous voulez être présent ,
ou la limite d'un mot, mais vous ne voulez pas qu'ils soient présents dans le groupe de correspondance (appelé par l'option m.group()
)
()
- les groupes correspondants sont entre parenthèses - dans ma regex j'ai utilisé deux groupes correspondants : #1 : (\\d{1,3})
#2 : ([a-z]{1,3})
(ils sont imprimés avec m.group(1)
y m.group(2)
)
Si vous n'êtes pas encore très familier avec la syntaxe des expressions régulières, vous pouvez consulter la documentation de l'API Java de l'élément suivant classe Pattern . Il existe une liste des utilisations possibles des expressions régulières. Cela vaut la peine d'essayer les expressions régulières, car cela pourrait vous faire gagner beaucoup de temps lorsque vous travaillerez avec des chaînes de caractères à l'avenir.
Edit :
En fait, cette regex peut être changée en :
(?<=\\b)(\\d{1,3})([a-z]{1,3})(?=\\b)
Il y a un regard positif derrière (?<=\\b)
- cela signifie que vous voulez que les chiffres soient précédés d'une limite de mot (inclure des virgules dans le lookahead et le lookbehind était redondant, je l'ai donc supprimé).