2013-07-08 11 views
7

Uso le espressioni regolari per convalidare l'input dell'utente. Ora posso configurare la regex e quindi aiuterebbe l'utente a vedere un esempio di come un input sicuro deve essere formattato.Codice C# per generare stringhe che corrispondono a un'espressione regolare

È possibile generare alcune stringhe che corrispondono a un'espressione regolare arbitraria? E c'è anche una implementazione utilizzabile da qualche parte?

AGGIORNAMENTO: A causa della licenza, non riesco a utilizzare REX. Ci sono altre possibilità?

+1

vi suggerisco di guardare in: http://research.microsoft.com/en-us/projects/rex/, fanno una cosa del genere. fammi sapere se funziona per te –

+1

Dai un'occhiata a questo sito web: http://debuggex.com. Inserisci qualsiasi espressione regolare che vuoi quindi dare un'occhiata alla sezione 'Alcune partite casuali '. Potresti essere sorpreso dalle proposizioni fatte quando la tua espressione regolare inizia a essere complicata. – Stephan

+0

Cosa potrebbe essere generato da '. *'? – Toto

risposta

6

Prova utilizzando questa applicazione Rex può fare questo :)

http://research.microsoft.com/en-us/projects/rex/

per Java è https://code.google.com/p/xeger/

quindi ci sono molti regex generatori :)

E questo: https://github.com/moodmosaic/Fare

E 'xeger involucro in C#

+0

Rex è bello ma a causa della licenza non posso usarlo. – schoetbi

+1

@schoetbi Ho trovato questo https://github.com/moodmosaic/Perché è wrapper per xeger in C#, prova questo :) – wudzik

+0

La tariffa sembra buona include una porta Xeger. Darei una prova – schoetbi

0

Quasi certamente no, no.

Le espressioni regolari vengono generalmente utilizzate, nel contesto che si sta guardando, per verificare che una stringa corrisponda a un determinato formato. Se sapete quale dovrebbe essere il vostro formato abbastanza bene da scrivere un'espressione regolare, non ci dovrebbe essere alcun motivo per cui non sia possibile generare i propri dati di test abbastanza facilmente.

[Modifica: sembra che ci siano alcuni esempi in giro. Ma questo ignora il fatto che, per verificare che la tua regex sia corretta, devi avere già scritto i dati del test. Quindi, si dovrebbe già avere le corde.]

+0

Penso che dovrebbe essere possibile avere una classe come regexparser in .net e invece di controllare le regole selezionare un esempio dei caratteri validi per ciascun token nella regex e aggiungerlo alla stringa di esempio. – schoetbi

+0

Nella situazione che descrivi, stai fornendo espressioni per convalidare i dati. Quindi sicuramente conosci già i dati, per aver scritto l'espressione in primo luogo? –

+0

Nessun utente non ha ancora inserito la stringa corrispondente. Mi piace presentargli esempi validi. – schoetbi

1

come specificato in commento, strumento Rex farà il trucco -

Utilizzando Rex per creare le stringhe che corrispondono alla vostra modello:

eseguire il rex.exe come segue:

rex.exe "your_regex_pattern_here" /k:your_required_examples_num_here 

maggiori informazioni riguardo a questo: Rex Guide

2

Alcune soluzioni:

(1) Se la regex è scritta dall'utente (non dall'utente) e raramente cambia, perché creare qualcosa a livello di programmazione? Potresti semplicemente creare alcuni bei esempi a mano.

(2) Utilizzare una soluzione pronta. (vedi altre risposte)

(3) Rejection sampling, la soluzione a tutti i problemi di generazione casuale: creare una stringa casuale e verificare se corrisponde alla regex. In caso contrario, riprova. Se la regex è molto specifica, tuttavia questa soluzione ha prestazioni terribili.

(4) Implementare un parser che trasformi una regex in un albero di costruzione stringa costituito ad es. dei nodi qui sotto. Ogni nodo ha un metodo CreateRandomString che segue determinate regole. Creare una stringa casuale significa chiamare quel metodo per il nodo radice.

concatenazione: Traverse tutte le sottostrutture del bambino e concatenare i risultati in ordine.

scelta casuale: selezionare un sottoalbero secondario casuale e attraversarlo. Restituisce il risultato.

moltiplicazione: creare un numero casuale n tra aeb. Attraversa il sottogruppo n volte e concatena i risultati.

leaf: Restituisce una stringa costante.

Creare il parser è la parte difficile :), soprattutto le strutture nidificate. (Ho scritto una per una sintassi simile a regex.)

+0

Ho parlato del numero 4 dal momento che il parser regex del framework .net è gestito in modo puro. Ma poi ho trovato la tariffa che funziona abbastanza bene. Le espressioni regex cambiano e ce ne sono diverse e sono anche configurabili dall'utente (non l'utente finale);) – schoetbi

Problemi correlati