Regexp che corrisponde alle espressioni regolari valide

Esiste un’espressione regolare che corrisponda alle espressioni regolari valide?

(So ​​che ci sono diversi gusti di espressioni regolari. Uno dovrebbe fare.)

Se vuoi semplicemente verificare se un’espressione regolare è valida o meno, cerca semplicemente di compilarla con qualsiasi linguaggio di programmazione o libreria di espressioni regolari con cui stai lavorando.

L’analisi delle espressioni regolari è tutt’altro che banale. Come autore di RegexBuddy , sono stato in giro per quel blocco un paio di volte. Se si vuole veramente farlo, utilizzare una regex per tokenizzare l’input e lasciare la logica di analisi al codice procedurale. Cioè, la tua regex corrisponderebbe a un token regolare ( ^ , $ , \w , ( , ) , ecc.) Alla volta e il tuo codice procedurale controllerebbe se sono nell’ordine corretto.

Esiste un’espressione regolare che corrisponda alle espressioni regolari valide?

Per definizione, è abbastanza semplice: no .

Il linguaggio di tutte le regex non è un linguaggio normale (basta guardare le parentesi nidificate) e quindi non ci può essere un’espressione regolare per analizzarlo.

Sfortunatamente, la maggior parte delle espressioni regolari non valide non sono valide a causa di errori di nidificazione delle parentesi. Questo è esattamente il tipo di stringhe che le espressioni regolari non possono eguagliare. (Ok, alcuni fantasiosi sistemi di espressioni regolari hanno estensioni di ricorsione, ma è raro)

Come già detto, non puoi descrivere espressioni regolari con un’espressione regolare a causa della loro natura ricorsiva. Avrai bisogno di una grammatica libera dal contesto per questo.

Ma quale sarebbe il motivo di avere un’espressione così regolare, comunque? Se vuoi solo verificare se un’espressione regolare è corretta, puoi semplicemente provare a usarla (Pattern.compile (regexp) in Java) e se urla non è valida.

Probabilmente hai bisogno di un parser, non di un’espressione regolare. I regex sono strumenti potenti, ma non sono strumenti di analisi. Ad esempio, non sono adatti alle grammatiche annidate.

Dal video 4 (di 4) di JavaScript Programming Language di Douglas Crockford:

/\/(\\[^\x00-\x1f]|\[(\\[^\x00-\x1f]|[^\x00-\x1f\\\/])*\]|[^\x00-\x1f\\\/\[])+\/[gim]*/

http://video.yahoo.com/watch/111596/1710658 a circa -17.20.

A seconda del tuo objective, direi sicuramente forse.

Se vuoi filtrare le espressioni regolari da qualche parte, potrebbe rivelarsi difficile in quanto le espressioni regolari sono disponibili in tutte le dimensioni e forms e non tutte iniziano e finiscono con delle barre.

Se hai solo bisogno di sapere se una regexp è valida, esiste un altro modo. A seconda della lingua che stai usando, potresti provare / prendere

Se puoi essere più specifico, potrei provare a dare una risposta migliore, la domanda è intrigante.