133 votes

Impossible d'échapper à la barre oblique inverse avec regex?

J'utilise la regex suivante

 ^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$
 

Je sais que c'est moche, mais jusqu'à présent, il sert à autre chose que la barre oblique inversée non autorisée car je pense qu'il devrait le faire car elle s'est échappée. J'ai aussi essayé \\ au lieu de \\\ mais avec les mêmes résultats. . Des idées?

257voto

Amber Points 159296

Si vous mettez cela dans une chaîne de caractères au sein d'un programme, vous pouvez réellement besoin d'utiliser quatre barres obliques inverses (parce que la chaîne analyseur de supprimer deux d'entre eux lors de l' "de fuite" pour la chaîne, puis la regex besoin de deux pour une fuite de regex barre oblique inverse).

Par exemple:

regex("\\\\")

est interprété comme...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

est interprété comme...

regex(\\)

est interprété comme une expression régulière qui correspond à une seule barre oblique inverse.


En fonction de la langue, vous pourriez être en mesure d'utiliser une autre forme de citer cela ne veut pas analyser les séquences d'échappement pour éviter d'avoir à utiliser un nombre - par exemple, en Python:

re.compile(r'\\')

L' r devant les guillemets en fait un raw de la chaîne qui permet de ne pas analyser les antislashes.

18voto

Vivin Paliath Points 40975

Si ce n'est pas un littéral, vous devez utiliser \\\\ pour obtenir \\ ce qui signifie une barre oblique inverse échappée.

C'est parce qu'il y a deux représentations. Dans la représentation sous forme de chaîne de votre expression rationnelle, vous avez "\\\\" , c'est-à-dire ce qui est envoyé à l'analyseur. L'analyseur verra \\ qu'il interprétera comme une barre oblique inversée valide (qui correspond à une seule barre oblique inversée).

12voto

Brad Points 6009

La barre oblique inverse \ est le caractère d'échappement des expressions régulières. Par conséquent, une double barre oblique inversée signifierait bien une seule barre oblique inverse littérale.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html

5voto

Nate Points 6155

À partir de http://www.regular-expressions.info/charclass.html :

Notez que seules les caractères spéciaux ou des caractères à l'intérieur d'une classe de caractères sont le crochet fermant (]), la barre oblique inverse (\), l'accent circonflexe (^) et le tiret (-). L'habitude des caractères sont des caractères normaux à l'intérieur d'une classe de caractères, et n'ont pas besoin d'être précédé d'une barre oblique inverse. À la recherche d'une étoile ou plus, utilisez [+*]. Votre regex fonctionnera bien si vous échapper de l'ordinaire des caractères à l'intérieur d'une classe de caractères, mais cela réduit considérablement la lisibilité.

Pour inclure une barre oblique inverse comme un personnage sans aucune signification particulière à l'intérieur d'une classe de caractères, vous devez vous échapper avec une autre barre oblique inverse. [\x] correspond à une barre oblique ou un x. Le crochet fermant (]), l'accent circonflexe (^) et le tiret (-) peut être inclus en s'échappant par une barre oblique inversée, ou en les plaçant dans une position où ils ne prennent pas sur leur signification particulière. Je recommande la méthode de ce dernier, puisqu'il améliore la lisibilité. Pour inclure un accent circonflexe, le placer n'importe où, sauf juste après le crochet ouvrant. [x^] correspond à un x ou d'un signe. Vous pouvez mettre le crochet de fermeture à droite après le crochet ouvrant, ou la négation de l'accent circonflexe. []x] correspond à un crochet de fermeture ou un x. [^]x] correspond à tout caractère qui n'est pas une parenthèse fermante ou un x. Le trait d'union peuvent être inclus juste après le crochet ouvrant, ou juste avant la parenthèse fermante, ou juste après la négation de l'accent circonflexe. Les deux [-x] et [x] correspond à un x ou un trait d'union.

Quelle langue écrivez-vous les regex?

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