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?

StackOverflow https://stackoverflow.com/questions/1814036

  •  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?

Était-ce utile?

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/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top