web-dev-qa-db-fra.com

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, cela sert à autre chose que la barre oblique inversée n'étant pas autorisée comme je le pense, car elle est échappée, j'ai aussi essayé \\ au lieu de \\\ mais les mêmes résultats. Des idées?

98
Eton B.

Si vous placez cela dans une chaîne dans un programme, vous devrez peut-être utiliser quatre barres obliques inverses (car l'analyseur de chaîne en supprimera deux lors de sa "suppression" pour string, besoin de deux pour une barre oblique inverse regex échappée).

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 rationnelle qui correspond à une seule barre oblique inversée.


En fonction de la langue, vous pouvez utiliser une forme de citation différente qui n'analyse pas les séquences d'échappement pour éviter d'en utiliser autant - par exemple, en Python:

re.compile(r'\\')

La r devant les guillemets en fait une chaîne raw qui n'analyse pas les échappements de barres obliques inverses.

185
Amber

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 "\\\\", qui est ce qui est envoyé à l'analyseur. L'analyseur verra \\ qu'il interprétera comme une barre oblique inversée (qui correspond à une seule barre oblique inverse).

13
Vivin Paliath

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

9
Brad

De http://www.regular-expressions.info/charclass.html :

Notez que les seuls caractères spéciaux ou métacaractères d'une classe de caractères sont le crochet de fermeture (]), la barre oblique inverse (\\), le curseur (^) et le trait d'union (-). Les métacaractères habituels sont des caractères normaux dans une classe de caractères et n'ont pas besoin d'être masqués par une barre oblique inverse. Pour rechercher une étoile ou un plus, utilisez [+ *]. Votre expression rationnelle fonctionnera correctement si vous échappez aux métacaractères habituels d'une classe de caractères, mais cela réduirait considérablement la lisibilité.

Pour inclure une barre oblique inverse en tant que caractère sans signification particulière dans une classe de caractères, vous devez l'échapper avec une autre barre oblique inverse. [\\ x] correspond à une barre oblique inverse ou à un x. La parenthèse fermante (]), le curseur (^) et le trait d'union (-) peuvent être inclus en leur échappant avec une barre oblique inverse ou en les plaçant dans une position où ils ne prennent pas leur signification particulière. Je recommande cette dernière méthode, car elle améliore la lisibilité. Pour inclure un signe, placez-le n’importe où sauf juste après le support d’ouverture. [x ^] correspond à un x ou à un caret. Vous pouvez mettre le crochet de fermeture juste après le crochet d’ouverture, ou le signe négatif. [] x] correspond à un crochet de fermeture ou à un x. [^] x] correspond à tout caractère autre qu'un crochet de fermeture ou un x. Le trait d'union peut être inclus juste après la parenthèse d'ouverture, ou juste avant la parenthèse de fermeture, ou juste après le curseur de négation. [-X] et [x-] correspondent tous deux à un x ou à un trait d'union.

Dans quelle langue écrivez-vous la regex?

3
Nate

Cette solution a résolu mon problème en remplaçant la balise br par '\ n'. 

alert(content.replace(/<br\/\>/g,'\n'));
0
hltsydmr