2010-05-25 13 views
6

È possibile rilevare se una determinata stringa è un'espressione regolare valida, utilizzando solo espressioni regolari?È possibile avere regexp che corrisponde a tutte le espressioni regolari valide?

Dire che ho alcune stringhe, che possono o meno essere espressioni regolari valide. Mi piacerebbe avere un'espressione regolare che corrisponda a quella stringa che corrisponde all'espressione regolare valida. È possibile? Oppure ho usato qualche grammatica di livello superiore (cioè un linguaggio libero dal contesto) per rilevare questo? Ha effetto se sto usando una versione estesa di espressioni regolari come le espressioni regolari di Perl?

Se ciò è possibile, qual è la regexp corrispondente alla regexp?

+0

possibile duplicato del [C'è un'espressione regolare per rilevare un'espressione regolare valida?] (http://stackoverflow.com/questions/172303/is-there-a-regular-expression-to-detect-a-valid-regular-expression) – outis

risposta

8

No, non è possibile. Questo perché le espressioni regolari valide implicano il raggruppamento, che richiede parentesi equilibrate.

I delimitatori bilanciati non possono essere confrontati con un'espressione regolare; devono invece essere abbinati a context-free grammar. (Il first example su quel articolo tratta parentesi bilanciate.)

+0

Ok, questo è vero con le normali espressioni regolari Che dire di qualcosa come Perl regex? –

+0

@Juha Syrjälä: In realtà, stavo pensando a Perl regex in modo specifico.Le parentesi di raggruppamento non possono essere abbinate a una regex, come ho spiegato. –

+0

PCRE e .NET estendono le espressioni regolari per eguagliare il bilanciamento sottogruppi Perl 6 espande regex con regole che consentono anche questo. Ma ormai la descrizione "espressione regolare" non è più precisa. In effetti, la maggior parte di ciò che oggi viene inteso per "espressione regolare" non è più regolare. –

0

Se la tua domanda era "corrisponde a tutte le espressioni regolari valide", la risposta è (forse a sorpresa) "sì". L'espressione regolare .* corrisponde a tutte le espressioni regolari valide (e non valide), ma è piuttosto inutile per determinare se stai osservando una valida.

Tuttavia, poiché la domanda è "abbinare tutte e solo le espressioni regolari validi", la risposta è (come hanno detto DVK e Platinum Azure" 'no'.