Vous ne pouvez pas échapper à la barre oblique inverse avec regex?

114

J'utilise l'expression régulière suivante

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

Je sais que c'est moche, mais jusqu'à présent, cela sert son objectif autre que la contre-oblique n'étant pas autorisée comme je pense qu'elle devrait parce qu'elle s'est échappée, j'ai également essayé \\au lieu de \\\mais les mêmes résultats. Des idées?

Eton B.
la source
4
Je viens de corriger la faute de frappe dans le titre, mais il y a quelque chose de profondément impressionnant dans le titre "Vous ne pouvez pas échapper à la réaction avec regex?" En effet!
Adam Crossland
1
@AdamCrossland Ne souhaitons-nous pas tous que les regex nous aident à échapper au contrecoup? > _>
Eton B.
2
Heck, je souhaite juste que je pourrais échapper à la réaction de regex.
Adam Crossland

Réponses:

226

Si vous placez ceci 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 la "déséchappement" de la chaîne , et l'expression régulière en a besoin de deux pour un antislash regex échappé).

Par exemple:

regex("\\\\")

est interprété comme ...

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

est interprété comme ...

regex(\\)

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


En fonction du langage, vous pourrez peut-être utiliser une forme différente de guillemets qui n'analyse pas les séquences d'échappement pour éviter d'en utiliser autant - par exemple, en Python:

re.compile(r'\\')

Le rdevant des guillemets en fait une chaîne brute qui n'analyse pas les échappements de backslash.

ambre
la source
14
hehe ... Je viens de tomber sur ceci et j'ai dû en ajouter trois. J'ai juste continué à ajouter des contre-obliques jusqu'à ce que cela fonctionne.
billynoah
ummm, pourquoi diable cette regex est-elle réinterprétée deux fois au lieu d'une fois comme c'est censé l'être pour PCRE?
Jim Michaels
3
@JimMichaels parce que tous les langages n'ont pas de littéraux regex sans échappement, et donc parfois le langage de programmation lui-même interprète les échappements de slash une fois dans sa syntaxe de chaîne, et la chaîne résultante est ensuite transmise au moteur regex (qui interprète les échappements de slash dans la syntaxe de regex).
Ambre
1
une fois, il y a longtemps, je devais capturer un xpath d'un élément dont la seule caractéristique d'identification était un chemin de fichier Windows, puis générer un programme (sous forme de chaîne) dans lequel les xpaths devaient être représentés sous forme de chaînes. à un moment donné des étapes intermédiaires, 8 barres obliques inverses étaient utilisées pour représenter une barre oblique inverse unique dans le chemin du fichier. C'est le plus haut que j'aie jamais obtenu.
Zackkenyon le
Cela peut devenir encore plus compliqué lors de la recherche de barres obliques inverses ainsi que de modèles nécessitant des méta-caractères. Prenez par exemple la recherche d'une barre oblique inverse suivie d'un chiffre. Maintenant , vous seriez à regarder l'expression suivante à essayer de comprendre ce qui se passe: new RegExp('\\\\\\d');.
jabacchetta
15

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 regex, vous avez "\\\\", qui est ce qui est envoyé à l'analyseur. L'analyseur verra \\ce qu'il interprète comme une barre oblique inverse d'échappement valide (qui correspond à une seule barre oblique inverse).

Vivin Paliath
la source
10

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

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

réf: http://www.regular-expressions.info/reference.html

Brad
la source
4

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

Notez que les seuls caractères spéciaux ou métacaractères à l'intérieur d'une classe de caractères sont le crochet fermant (]), la barre oblique inverse (\\), le curseur (^) et le tiret (-). Les métacaractères habituels sont des caractères normaux dans une classe de caractères et n'ont pas besoin d'être échappés par une barre oblique inverse. Pour rechercher une étoile ou un plus, utilisez [+ *]. Votre expression régulière fonctionnera bien si vous échappez aux métacaractères normaux dans une classe de caractères, mais cela réduit considérablement la lisibilité.

Pour inclure une barre oblique inverse en tant que caractère sans aucune 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. Le crochet fermant (]), le curseur (^) et le trait d'union (-) peuvent être inclus en les é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 curseur, placez-le n'importe où sauf juste après le support d'ouverture. [x ^] correspond à un x ou à un signe d'insertion. Vous pouvez placer le crochet de fermeture juste après le crochet ouvrant ou le curseur de négation. [] x] correspond à un crochet fermant ou à un x. [^] x] correspond à tout caractère qui n'est pas un crochet fermant ou un x. Le trait d'union peut être inclus juste après le crochet ouvrant, ou juste avant le crochet fermant, ou juste après le signe d'insertion.

Dans quelle langue écrivez-vous l'expression régulière?

Nate
la source
0

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

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