2009-03-23 19 views
8

Qualcuno ha il codice per trovare un file che contiene un'espressione regolare? Immagino che tu possa avere due gusti diversi, uno per i BRE e uno per gli ERE.Espressione regolare per trovare un'espressione regolare?

Si potrebbe pensare che una specie di suite di test abbia qualcosa come un test isRegex(). Qualcuno può avere qualche codice? Alla ricerca di qualcosa di completo, naturalmente.

Vedo che questo è stato discusso here ma non ha visto alcuna risposta pratica. Se voglio grep per qualsiasi file che contiene un'espressione regolare, magari delimitata dal tipico //, come dovrei farlo?

+0

possibile duplicato di [Esiste 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) –

risposta

18

Le espressioni regolari non sono di per sé regular language. L'indizio è che contengono parentesi e parentesi quadre e tali devono essere bilanciati.

Un'espressione regolare può essere descritta da un context-free grammar e analizzata con un recursive-descent parser.

+0

+1 per correttezza. –

3

Al di là

egrep '/.+/' file 

si sta guardando un esercizio davvero coinvolto.

1

Se si cercano specificamente file che contengono espressioni solo o prevalentemente regolari, le statistiche dovrebbero indicare che un determinato file contiene più di quella sintassi di altri. Quindi puoi definire una serie di indicatori e combinare i loro punteggi in una metrica che ha segnato un file su quanto è probabile che sia di interesse. Scegli un taglio e lascialo andare. Alcuni indicatori:

  • esistenza di più di un [0-9], [AZ], + ecc
  • Esistenza di/foo/
  • Non è un file di codice standard
  • Meno comprimibile (dubbia, lo so, ma la compattezza della grammatica regex sarebbe intuitivamente essere più difficile da comprimere delle parole normali)
  • ecc

ma se questo è solo un one-shot, allora siete probabilmente meglio fuori utilizzando Chaos's answer e analizzando manualmente i risultati. C'è qualcosa in particolare nella regex che stai cercando, che potrebbe essere più facile da riprendere?