Est-il possible d'utiliser une liste de paramètres de chaîne avec une expression régulière (avec des groupes) pour construire une nouvelle chaîne?
-
06-07-2019 - |
Question
Disons par exemple que j'ai une expression régulière comme celle-ci:
"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."
Cette expression rationnelle a 3 composants groupés - si elle correspond à une chaîne donnée, l’API de regex vous permettrait d’extraire facilement la valeur de chaque groupe.
Maintenant, disons que j'ai 3 chaînes:
["red", "leaps","cat"]
Si nous supposons que tous les caractères de l'expression régulière qui ne font pas partie d'un groupe sont simplement des caractères de texte littéral - existe-t-il un moyen d'insérer ensuite chacune de ces 3 chaînes dans le groupe correspondant de l'expression rationnelle d'origine, ce qui donne une chaîne de sortie combinant la partie non groupée de l'expression rationnelle? Dans ce cas, le "renard roux rapide saute par-dessus le chat paresseux". De préférence, sans qu'il soit nécessaire d'avoir une chaîne qui correspond déjà à l'expression régulière.
Je cherche à faire cela en Java - je suis à peu près sûr que java.util.regex ne le supporte pas, mais je pensais qu'il y aurait peut-être une bibliothèque tierce capable de le faire. Quelqu'un peut-il me donner des indications?
La solution
Tant que vous pouvez vous passer des groupes de capture imbriqués, vous pouvez simplement utiliser davantage de regex pour récupérer les littéraux:
String[] strings = new String[] { "red", "leaps", "dog" };
String[] literals = new String("The quick (red|brown|blue|yellow) fox " +
"(jumps|leaps) over the lazy (dog|cat).").split("(?=[^\\\\])\\(.*?\\)");
StringBuilder sb = new StringBuilder(literals[0]);
for(int i = 0; i < strings.length; i++) {
sb.append(strings[i]);
sb.append(literals[i + 1]);
}
// => sb.toString();
Autres conseils
La plupart des implémentations de regex vous permettent de faire quelque chose comme ceci dans une recherche et de remplacer:
s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/