Perché alcuni comandi regex hanno interpretazioni opposte di '\' con vari caratteri?


10

Prendi, ad esempio, questo comando:

find . -regex ".*\.\(cpp\|h\)"

Questo troverà tutti i file .h e .cpp nella tua directory. Il carattere punto "." nelle espressioni regolari di solito significa "qualsiasi carattere". Per farlo corrispondere solo a un periodo effettivo, è necessario evitarlo utilizzando il carattere barra rovesciata '\'.

In questo caso, dato un personaggio con un significato speciale, devi scappare per ottenere il personaggio reale che rappresenta.

Ora prendi la parentesi e la barra "o", rispettivamente i caratteri '(', ')' e '|'. Questi hanno anche significati speciali, usati per raggruppare espressioni regolari. Tuttavia, per ottenere il significato speciale, i personaggi devono essere sfuggiti usando la barra rovesciata! Senza la barra rovesciata, i personaggi hanno il significato del personaggio reale che rappresenta.

Perché è il '.' trattato in modo diverso da '(', ')' e '|'?

Risposte:


12

La risposta è davvero "solo perché". C'è un sacco di diverse sintassi di espressioni regolari, e mentre condividono un aspetto simile e di solito le basi sono le stesse, variano nei dettagli.

Storicamente, ogni strumento aveva la sua nuova implementazione, facendo qualunque cosa l'autore pensasse meglio. C'è un equilibrio tra rendere speciali i personaggi con e senza scappare - troppi personaggi che sono "naturalmente speciali" e finisci per doverli sfuggire continuamente solo per abbinarli; o, viceversa, si finisce per aver bisogno di un sacco di escape per usare la sintassi regex comune come il raggruppamento (). E tutti coloro che hanno scritto un programma hanno deciso come farlo in base alle esigenze di ciò a cui il loro programma si confrontava, a quello che ritenevano fosse l'approccio giusto e sulla fase lunare.

C'è un tentativo di standardizzazione da POSIX, che definisce " espressioni regolari di base " ed " espressioni regolari estese ". Incredibilmente, questi all'indietro lavoro gli uni dagli altri in materia di \- a volte , ma non con perfetta coerenza.

Le espressioni regolari del Perl sono diventate un altro standard defacto, per due ragioni: in primo luogo, sono molto flessibili e potenti, e in secondo luogo, sono in realtà piuttosto sane , con convenzioni come "\ sfugge sempre a un carattere non alfanumerico".

GNU Find ha -regextypeun'opzione, in cui è possibile modificare la sintassi delle espressioni regolari utilizzata. Purtroppo, "perl" non è un'opzione, almeno nella versione di find che ho. (L'impostazione predefinita è, non sorprendentemente da GNU, "emacs" e che la sintassi è documentata qui .)

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.