2012-11-10 15 views
8

Wikipedia says che ha esteso le espressioni regolari "ha abbandonato il supporto per le sottorappresentazioni", quindi la modalità regex "di base" deve essere utilizzata per abilitarle. Tuttavia, sembra che un certo numero di implementazioni do supportino i riferimenti a ritroso per espressioni regex estese. Ad esempio, con gcc 4.6 su Ubuntu Precise, sono supportati. Implementazioni di FreeBSD seem to supportali solo nella modalità di base.Le regex estese supportano i riferimenti indietro?

Boost says (e sembra essere d'accordo con Wikipedia) che le sottofrequenze non sono supportate per regex estese, ma Boost :: Regex le aggiunge come un'estensione.

Questa è solo una parte mal definita dello standard che viene interpretata in modo diverso da ogni implementazione?

+0

Wikipedia non è sempre la migliore fonte di informazioni affidabili. Non vedo alcun motivo per cui le sottostazioni non dovrebbero essere supportate in espressioni regolari estese in qualsiasi implementazione/ambiente. Lo standard POSIX non supporta i riferimenti di ritorno per le espressioni regolari estese, ma non conosco alcuna implementazione che segua questo "standard". –

+0

+ Ωmega apparentemente le implementazioni di FreeBSD seguono questo. Leggendo la manpage "re_format", è stata aggiunta una speciale modalità "enhanced" per supportare i riferimenti a ritroso in modalità estesa. –

+0

Sembra che "egrep" in FreeBSD li supporti. –

risposta

5

Come altri hanno già sottolineato, è chiaro che POSIX EREs non supporta i riferimenti di ritorno.

La motivazione data nel OpenGroup Base Specifiche Numero 7 per non aggiungere back-riferimenti a ERE è dato come:

È stato suggerito che, oltre ad intervallo di espressioni, back-riferimenti (' \ n ') dovrebbe anche essere aggiunto agli ERE. Questo è stato rifiutato dagli sviluppatori standard come probabile che diminuisca il consenso.

Citato da: Rationale: Base Definitions: Extended Regular Expressions

La ragione principale di questa limitazione è di consentire POSIX ERE da convertire in un automi finiti deterministici (DFA), e in effetti l'implementazione originale di ERE in Unix è stato fatto come un DFA. L'uso di un DFA consente di fare delle garanzie sulle prestazioni dell'implementazione. Il matching di pattern con (un numero illimitato di) riferimenti precedenti è un problema NP-difficile, e forse anche un problema NP-completo. Il consenso nel comitato di standard POSIX non avrebbe mai potuto essere raggiunto se fossero stati proposti riferimenti di retromarcia per EREs perché ciò avrebbe costretto tutte le aziende a utilizzare l'implementazione originale di Unix per cambiare il loro codice a un'implementazione non deterministica e a rinunciare alle loro garanzie di performance, e alcuni di quelle società avevano membri nel comitato.

Si è anche notato che i riferimenti di retro nelle RE non sono intuitivi né per gli utenti né per gli implementatori, e anzi hanno causato una confusione estrema più spesso di adesso. Si veda ad esempio gli esempi forniti in RE-Interpretation: The Dark Corners

NOTA: back-riferimenti nel RES non sono gli stessi riferimenti a sub-pattern nel testo di sostituzione a strumenti come sed.

4

Secondo le espressioni regolari estese IEEE/Open Group standard non supportano i riferimenti a ritroso (Sezione 9.5.1), sebbene diverse implementazioni del mondo reale lo facciano.

1

In base allo POSIX.1-2008 standard, solo le espressioni regolari di base supportano i riferimenti a ritroso. Section 9.3.6 descrive come funzionano in BRE. La sezione delle espressioni regolari estese non le menziona affatto, e lo Grammar Lexical Conventions nella sezione 9.5.1 afferma che i token di riferimento a posteriori si applicano solo ai BRE.

Problemi correlati