Sfuggire a una barra in un'espressione regolare


106

La mia domanda è semplice e riguarda la fuga di espressioni regolari. Devi sfuggire a una barra /in avanti in un'espressione regolare? E come faresti a farlo?


1
Quale implementazione di linguaggio / espressioni regolari usi?
Gumbo

È interessante notare che stavo cercando questa domanda per Javascript. Ma poi il mio IDE ha detto che stavo usando una fuga non necessaria. Quindi myStr.replace(/[/:.-]+/gi, '_')è valido con mia sorpresa. Ho pensato che avrei avuto bisogno /[\/:.-]+/gi. Non riesco a decidere se questo è interessante o confuso.
Turbo

Risposte:


90

Quale contesto / lingua? Alcuni linguaggi usano /come delimitatore di pattern, quindi sì, è necessario evitarne l'escape, a seconda della lingua / contesto. Puoi evadere mettendo una barra all'indietro davanti ad esso: \/per alcune lingue (come PHP) puoi usare altri caratteri come delimitatore e quindi non è necessario eseguire l'escape. Ma AFAIK in tutte le lingue, l'unico significato speciale che /ha è che può essere il delimitatore di pattern designato.


38

Ecco alcune opzioni:

  • In Perl, puoi scegliere delimitatori alternativi. Non sei limitato a m//. Potresti sceglierne un altro, come m{}. Quindi la fuga non è necessaria. In effetti, Damian Conway in "Perl Best Practices" afferma che m{}è l'unico delimitatore alternativo che dovrebbe essere usato, e questo è rafforzato da Perl :: Critic (su CPAN). Mentre puoi cavartela usando una varietà di caratteri delimitatori alternativi, //e {}sembra che sia il più chiaro da decifrare in seguito. Tuttavia, se una di queste scelte risulta in troppe fughe, scegli quella che si presta meglio alla leggibilità. Esempi comuni sono m(...), m[...]e m!...!.

  • Nei casi in cui non puoi o preferisci non usare delimitatori alternativi, puoi sfuggire alle barre in avanti con una barra rovesciata: m/\/[^/]+$/ad esempio (usando un delimitatore alternativo che potrebbe diventare m{/[^/]+$}, che potrebbe leggere più chiaramente). Sfuggire alla barra con una barra rovesciata è abbastanza comune da aver guadagnato un nome e una pagina di wikipedia: Sindrome da stuzzicadenti pendente . Nelle espressioni regolari in cui c'è solo una singola istanza, l'escape di una barra potrebbe non salire al livello di essere considerato un ostacolo alla leggibilità, ma se inizia a sfuggire di mano e se la tua lingua consente delimitatori alternativi come fa Perl, ciò farebbe essere la soluzione preferita.


1
Puoi fare un esempio? Ho questo: perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.confe sto ottenendo conflitti con le barre in avanti.
CMCDragonkai

Nota che usi un s, non un m, quando esegui una sostituzione (aka sostituto) con espressioni regolari. perlfect.com/articles/regex.shtml
Mashmagar

2
@CMCDragonkai perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf... ma probabilmente è meglio: perl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.confperché evita l'interpolazione della shell.
DavidO

1
Un'alternativa all'escape del /carattere letterale è usare la funzionalità regex per specificare un carattere mediante la sua codifica ASCII, in esadecimale o ottale. Perl accetta la forma ottale \57(fonte regular-expressions.info/refcharacters.html )
lukeuser

Nella pagina linkata da lukeuser (grazie) c'è anche la sequenza di escape \ Q ... \ E. Questo ha funzionato per me.
user3012857

11

Usa la barra rovesciata \o scegli un delimitatore diverso, ad esempio m#.\d#invece di /.\d/ "In Perl, puoi cambiare il delimitatore di espressioni regolari / in quasi tutti gli altri caratteri speciali se lo precedi con la lettera m (per corrispondenza);"


6

Se il delimitatore è /, dovrai uscire.


0

Se utilizzi C #, non è necessario eseguirne l'escape.


Può essere, ma qui stanno usando perl.
Toto

0

Per Java, non è necessario.

eg: "^(.*)/\\*LOG:(\\d+)\\*/(.*)$" ==> ^(.*)/\*LOG:(\d+)\*/(.*)$

Se metti \ davanti a /. IDE ti dirà "Redundant Character Escape" \ / "in ReGex"

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.