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 ?

6voto

pocesar Points 2577

Bien que la réponse soit pour Java, le code peut être facilement adapté à partir de cette extension Kotlin String que j'ai trouvée (adaptée de celle fournie par @brcolow) :

private val escapeChars = charArrayOf(
    '<',
    '(',
    '[',
    '{',
    '\\',
    '^',
    '-',
    '=',
    '$',
    '!',
    '|',
    ']',
    '}',
    ')',
    '?',
    '*',
    '+',
    '.',
    '>'
)

fun String.escapePattern(): String {
    return this.fold("") {
      acc, chr ->
        acc + if (escapeChars.contains(chr)) "\\$chr" else "$chr"
    }
}

fun main() {
    println("(.*)".escapePattern())
}

imprime \(\.\*\)

Regardez-le en action ici https://pl.kotl.in/h-3mXZkNE

5voto

pete Points 86

D'après la suggestion de @Sorin concernant la documentation sur les modèles Java, il semble que les caractères à échapper soient au moins les suivants :

\.[{(*+?^$|

4voto

wheeler Points 757

El Pattern.quote(String s) fait en quelque sorte ce que vous voulez. Cependant, elle laisse un peu à désirer ; elle n'échappe pas réellement les caractères individuels, mais enveloppe simplement la chaîne de caractères avec le symbole \Q...\E .

Il n'existe pas de méthode qui permette de faire exactement ce que vous recherchez, mais la bonne nouvelle est qu'il est en fait assez simple d'échapper à tous les caractères spéciaux d'une expression régulière Java :

regex.replaceAll("[\\W]", "\\\\$0")

Pourquoi cela fonctionne-t-il ? Eh bien, la documentation de Pattern indique spécifiquement qu'il est permis d'échapper à des caractères non alphabétiques qui ne doivent pas nécessairement être échappés :

C'est une erreur d'utiliser une barre oblique inverse avant tout caractère alphabétique qui ne désigne pas une construction échappée ; ces caractères sont réservés pour de futures extensions du langage d'expression régulière. Une barre oblique inverse peut être utilisée avant un caractère non alphabétique, que ce caractère fasse partie ou non d'une construction non encodée.

Par exemple, ; n'est pas un caractère spécial dans une expression régulière. Toutefois, si vous l'échappez, Pattern interprétera toujours \; comme ; . Voici quelques autres exemples :

  • > devient \> ce qui est équivalent à >
  • [ devient \[ qui est la forme échappée de [
  • 8 est toujours 8 .
  • \) devient \\\) qui sont les formes échappées de \ y ( concaténés.

Nota: La clé est la définition de "non-alphabétique", qui, dans la documentation, signifie en réalité "non alphabétique". mot "ou des caractères qui ne font pas partie du jeu de caractères [a-zA-Z_0-9] .

3voto

Bo6Bear Points 19

De l'autre côté de la médaille, vous devriez utiliser une regex "non-char" qui ressemble à ceci si les caractères spéciaux = allChars - number - ABC - space dans le contexte de votre application.

String regepx = "[^\\s\\w]*";

1voto

brcolow Points 408

En supposant que vous disposez de la liste des caractères d'échappement utilisés par Java regex et que vous lui faites confiance (ce serait bien si ces caractères étaient exposés dans un membre de la classe Pattern), vous pouvez utiliser la méthode suivante pour échapper au caractère si cela est nécessaire :

private static final char[] escapeChars = { '<', '(', '[', '{', '\\', '^', '-', '=', '$', '!', '|', ']', '}', ')', '?', '*', '+', '.', '>' };

private static String regexEscape(char character) {
    for (char escapeChar : escapeChars) {
        if (character == escapeChar) {
            return "\\" + character;
        }
    }
    return String.valueOf(character);
}

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