2010-07-26 32 views
5

Qualcuno sa dove posso venire da un'espressione regolare che corrisponde a qualsiasi espressione regolare in stile C# valida? È possibile?Regex che corrisponde a qualsiasi espressione regolare valida

FYI, la ragione per cui sto provando a farlo è perché ho un mini linguaggio che consente espressioni regolari come parte della sua sintassi e ho messo insieme le regex scadenti per convalidare le istruzioni in minime, ma fallisce in modo errato alcune espressioni più complicate. La sintassi mini-linguaggio è definita attraverso una combinazione di eBNF ed espressioni regolari. Potrei fare questa "validazione" in C#, ma penso che se questo approccio è possibile, sarebbe più pulito e la migliore separazione delle preoccupazioni.

Grazie, brian

+0

Se la regex è scritta in .NET flavor ...? – kennytm

risposta

10

No, non puoi. Almeno non generalmente. Le espressioni regolari descrivono linguaggi regolari e quelli sono caratterizzati dal fatto che non possono contenere espressioni nidificate arbitrariamente. Quindi qualcosa come

(ab(?:cd)e(fg)) 

è già praticamente impossibile convalidare solo con le espressioni regolari. Mentre alcuni tipi di espressioni regolari consentono la discesa ricorsiva nella corrispondenza (Perl, ad esempio) o gruppi di cattura bilanciati che possono emularlo in qualche misura, è sicuramente non lo strumento pensato per questo lavoro e non si dovrebbe provare a calzare in uno.

Cosa si può do è solo provare a compilare un'espressione che si desidera convalidare. Il motore di espressioni regolari di .NET genera un'eccezione se il modello non è valido:

var compiledRegex = new Regex(someString); 
+0

Questo era che avevo paura, ma se è l'unica opzione, allora credo di doverlo fare. Grazie per il chiarimento/spiegazione. –

+0

L'utilizzo di eccezioni per controllare il flusso dell'applicazione non è la soluzione migliore, ma la scrittura di un validatore per le espressioni regolari non è banale. –

+0

Bene usando la linea "new Regex (someString);" essenzialmente convaliderà la regex. La stringa che viene validata è tecnicamente input dell'utente, quindi intercettare un'eccezione sull'input utente errato è probabilmente il modo più ragionevole per gestirlo. Destra? –

Problemi correlati