web-dev-qa-db-fra.com

Comment échapper à un crochet pour la compilation de motifs

J'ai une liste d'expressions régulières séparées par des virgules:

.{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]

J'ai fait une scission sur la virgule. J'essaye maintenant de faire correspondre cette expression régulière à un mot de passe généré. Le problème est que Pattern.compile n'aime pas les crochets qui ne sont pas échappés. Certains peuvent-ils me donner une fonction simple qui prend une chaîne comme ceci: [0-9] et renvoie la chaîne d'échappement \[0-9\].

25
Afamee

Vous pouvez utiliser Pattern.quote(String) .

À partir de la documentation:

public static String quote​(String s)

Renvoie un modèle littéral String pour le String spécifié.

Cette méthode produit une chaîne qui peut être utilisée pour créer un modèle qui correspondrait à la chaîne s comme s'il s'agissait d'un modèle littéral.

Les métacaractères ou séquences d'échappement dans la séquence d'entrée n'auront aucune signification particulière.

24
Laurence Gonsalves

Pour une raison quelconque, la réponse ci-dessus n'a pas fonctionné pour moi. Pour ceux comme moi qui viennent après, voici ce que j'ai trouvé.

Je m'attendais à ce qu'une seule barre oblique inverse échappe au crochet, cependant, vous devez en utiliser deux si vous avez le modèle stocké dans une chaîne. La première barre oblique inverse échappe la seconde dans la chaîne, de sorte que ce que regex voit est \]. Puisque regex ne voit qu'une seule barre oblique inverse, elle l'utilise pour échapper au crochet carré.

\\] 

Dans regex, cela correspondra à un seul crochet de fermeture.

Si vous essayez de faire correspondre une nouvelle ligne, par exemple, vous n'utiliserez qu'une seule barre oblique inverse. Vous utilisez le modèle d'échappement de chaîne pour insérer un caractère de nouvelle ligne dans la chaîne. Regex ne voit pas \n - il voit le caractère de nouvelle ligne et correspond à cela. Vous avez besoin de deux barres obliques inverses car ce n'est pas une séquence d'échappement de chaîne, c'est une séquence d'échappement regex.

33
Cullub

Vous pouvez utiliser les caractères spéciaux\Q et\E ... tout ce qui se trouve entre\Q et\E est automatiquement échappé.

\Q[0-9]\E
13
Dan Breen

Pattern.compile() aime bien les crochets. Si tu prends la corde

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"

et divisez-le par des virgules, vous vous retrouvez avec cinq expressions régulières parfaitement valides: la première correspond à huit caractères non séparateurs de ligne, la seconde correspond à un chiffre ASCII, etc.). À moins que vous ne soyez vraiment veulent faire correspondre des chaînes comme ".{8}" et "[0-9]", Je ne vois pas pourquoi vous auriez besoin d'échapper à quoi que ce soit.

3
Alan Moore