130 votes

Liste de tous les caractères spéciaux qui doivent être échappés dans une regex.

J'essaie de créer une application qui fait correspondre un modèle de message avec un message qu'un utilisateur essaie d'envoyer. J'utilise une expression rationnelle Java pour faire correspondre le message. Le modèle/message peut contenir des caractères spéciaux.

Comment puis-je obtenir la liste complète des caractères spéciaux qui doivent être échappés pour que ma regex fonctionne et corresponde dans le maximum de cas possibles ?

Existe-t-il une solution universelle pour l'échappement de tous les caractères spéciaux dans les regex Java ?

106voto

Tobi G. Points 31
  • Les caractères Java qui doivent être échappés dans les expressions régulières sont les suivants :
    \.[]{}()<>*+-=!?^$|
  • Deux des parenthèses fermantes ( ] y } ) ne doivent être échappées qu'après avoir ouvert le même type de parenthèse.
  • Sur [] -met entre parenthèses certains caractères (comme + y - ) fonctionnent parfois sans échappatoire.

104voto

Sorin Points 676

Vous pouvez consulter la javadoc de la classe Pattern : http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

Vous devez échapper tous les caractères qui y figurent si vous souhaitez obtenir le caractère normal et non le caractère spécial.

Comme solution peut-être plus simple, vous pouvez mettre le modèle entre \Q y \E - tout ce qui se trouve entre eux est considéré comme échappé.

34voto

madx Points 159

Pour s'échapper, il suffit d'utiliser la méthode suivante Java 1.5 :

Pattern.quote("$test");

Vous allez correspondre exactement au mot $test

18voto

Bohdan Points 1882

Selon le Caractères littéraux de chaîne / Métacaractères page de documentation, ils le sont :

<([{\^-=$!|]})?*+.>

Il serait également intéressant que cette liste soit référencée quelque part dans le code, mais je ne sais pas où cela pourrait être...

8voto

NeuroDuck Points 71

En combinant ce que tout le monde a dit, je propose ce qui suit, pour garder la liste des caractères spéciaux à RegExp clairement listés dans leur propre chaîne, et pour éviter d'avoir à essayer de parser visuellement des milliers de " \\ "'s. Cela semble fonctionner assez bien pour moi :

final String regExSpecialChars = "<([{\\^-=$!|]})?*+.>";
final String regExSpecialCharsRE = regExSpecialChars.replaceAll( ".", "\\\\$0");
final Pattern reCharsREP = Pattern.compile( "[" + regExSpecialCharsRE + "]");

String quoteRegExSpecialChars( String s)
{
    Matcher m = reCharsREP.matcher( s);
    return m.replaceAll( "\\\\$0");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X