Non puoi sfuggire al backslash con regex?


114

Sto usando la seguente regex

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

So che è brutto, ma finora ha uno scopo diverso dal fatto che il backslash non è consentito come penso dovrebbe perché è sfuggito, ho anche provato al \\posto di \\\ma gli stessi risultati. Qualche idea?


4
Ho appena corretto l'errore di battitura nel titolo, ma c'è qualcosa di profondamente fantastico nel titolo "Non puoi sfuggire al contraccolpo con regex?" Infatti!
Adam Crossland

1
@AdamCrossland Non desideriamo tutti che regex possa aiutarci a sfuggire al contraccolpo? > _>
Eton B.

2
Diamine, vorrei solo poter sfuggire al contraccolpo FROM regex.
Adam Crossland

Risposte:


225

Se lo stai inserendo in una stringa all'interno di un programma, potresti effettivamente aver bisogno di usare quattro backslash (perché il parser di stringhe ne rimuoverà due quando "de-escaping" per la stringa , e quindi la regex ne ha bisogno di due per un barra rovesciata di regex con escape).

Per esempio:

regex("\\\\")

è interpretato come ...

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

è interpretato come ...

regex(\\)

viene interpretato come una regex che corrisponde a una singola barra rovesciata.


A seconda della lingua, potresti essere in grado di utilizzare una forma diversa di citazione che non analizza le sequenze di escape per evitare di doverne utilizzare tante, ad esempio in Python:

re.compile(r'\\')

Il rfronte delle citazioni rende un grezzo stringa che fa fughe backslash non analizza.


14
hehe ... mi sono imbattuto in questo e dovevo aggiungerne tre. Ho continuato ad aggiungere barre rovesciate finché non ha funzionato.
billynoah

ummm, perché diavolo questa regex viene reinterpretata due volte invece di una volta come dovrebbe essere per PCRE?
Jim Michaels

3
@JimMichaels perché non tutte le lingue hanno letterali regex senza caratteri di escape, e quindi a volte il linguaggio di programmazione stesso interpreta gli escape barra una volta nella sintassi della stringa e la stringa risultante viene quindi passata al motore regex (che interpreta gli escape barra nella sintassi regex).
Amber

1
una volta, molto tempo fa, dovevo catturare un xpath di un elemento la cui unica caratteristica identificativa era un percorso di file di Windows, quindi generare un programma (come stringa) in cui xpaths da rappresentare come stringhe. a un certo punto nei passaggi intermedi c'erano 8 barre rovesciate utilizzate per rappresentare una singola barra rovesciata nel percorso del file. È il più alto che abbia mai ottenuto però.
Zackkenyon

Questo può diventare ancora più complicato durante la ricerca di barre rovesciate insieme a modelli che richiedono meta caratteri. Prendiamo ad esempio la ricerca di una barra rovesciata seguita da una cifra. Ora si sarebbe fissando la seguente espressione a cercare di capire cosa sta succedendo: new RegExp('\\\\\\d');.
jabacchetta

15

Se non è letterale, devi usarlo in \\\\modo da ottenere il \\che significa una barra rovesciata con escape.

Questo perché ci sono due rappresentazioni. Nella rappresentazione di stringa della tua regex, hai "\\\\", Che è ciò che viene inviato al parser. Il parser vedrà \\quale interpreta come una barra rovesciata con escape valida (che corrisponde a una singola barra rovesciata).



4

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

Notare che gli unici caratteri speciali o metacaratteri all'interno di una classe di caratteri sono la parentesi graffa di chiusura (]), la barra rovesciata (\\), il carattere (^) e il trattino (-). I soliti metacaratteri sono caratteri normali all'interno di una classe di caratteri e non è necessario che siano preceduti da una barra rovesciata. Per cercare una stella o un segno più, usa [+ *]. La tua regex funzionerà bene se esegui l'escape dei metacaratteri regolari all'interno di una classe di caratteri, ma così facendo riduce significativamente la leggibilità.

Per includere una barra rovesciata come carattere senza alcun significato speciale all'interno di una classe di caratteri, è necessario eseguirne l'escape con un'altra barra rovesciata. [\\ x] corrisponde a una barra rovesciata o una x. La parentesi quadra di chiusura (]), l'accento circonflesso (^) e il trattino (-) possono essere inclusi facendoli sfuggire con una barra rovesciata o posizionandoli in una posizione in cui non assumono il loro significato speciale. Raccomando quest'ultimo metodo, poiché migliora la leggibilità. Per includere un accento circonflesso, posizionalo ovunque tranne che subito dopo la parentesi di apertura. [x ^] corrisponde a una x o un accento circonflesso. È possibile inserire la parentesi di chiusura subito dopo la parentesi di apertura o il cursore di negazione. [] x] corrisponde a una parentesi di chiusura o una x. [^] x] corrisponde a qualsiasi carattere che non sia una parentesi di chiusura o una x. Il trattino può essere incluso subito dopo la parentesi di apertura, o subito prima della parentesi di chiusura o subito dopo il segno di omissione di negazione.

In che lingua stai scrivendo la regex?


0

Questa soluzione ha risolto il mio problema durante la sostituzione del tag br in "\ n".

alert(content.replace(/<br\/\>/g,'\n'));
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.