2011-11-05 15 views
96

Attualmente sto programmando un algoritmo di vocabolario che controlla se un utente ha digitato correttamente la parola. Ho la seguente situazione: La soluzione corretta per la parola sarebbe "parte1, parte2". L'utente dovrebbe essere in grado di inserire "part1" (risposta 1), "parte2" (risposta 2) o "parte1, parte2" (risposta 3). io ora cerco di abbinare la stringa specificata dall'utente con il seguente, creato automaticamente, espressione regex:e/o operatore nell'espressione regolare

^(part1|part2)$ 

Questo solo restituisce Risposta 1 e 2 come corrette, mentre risposta 3 sarebbe sbagliato. Ora mi chiedo se c'è un operatore simile a | che dice "e/o" invece di "o ... o". Qualcuno può aiutarmi qui?

+0

espressioni regolari potrebbe non essere la soluzione migliore per questo. Userei i normali metodi di stringa. –

+1

Questo problema è scarsamente specificato. Perché stai usando la corrispondenza dei pattern quando tutto ciò di cui hai bisogno è un confronto di stringhe esatte contro un insieme di stringhe legali? A meno che il compilatore regex non ottimizzi le alternative in una struttura trie O (1) come fa Perl, probabilmente dovresti fare un test contro l'appartenenza all'hash invece. Altri motori regex non sono molto intelligenti in questo. – tchrist

risposta

132

ho intenzione di assumere si vuole costruire un l'espressione regolare in modo dinamico per contenere altre parole che part1 e part2, e che si desidera per non avere importanza. Se è così si può usare qualcosa di simile:

((^|,)(part1|part2|part3))+$ 

positivo corrisponde:

part1 
part2, part1 
part1, part2, part3 

partite negative:

part1,   //with and without trailing spaces. 
part3, part2, 
otherpart1 
+0

Si noti che "part1, part" 1 sarà anche positivo. Quale non è sempre auspicabile – dimaaan

+0

@dimaaan Hai sbagliato le tue virgolette? "part1, part1" sarà una corrispondenza, ma "part1, part" non lo sarà. Sebbene tu abbia ragione nel ritenere che tale scenario non sia coperto da questa soluzione, per l'applicazione dell'OP in cui sta controllando se la stringa di prova consiste di parole in un vocabolario, credo che voglia una corrispondenza positiva anche quando una parola è ripetuto. La parola sarà ancora parte del vocabolario, non importa quanti casi ci siano. – Mithon

2

Non è esperto in regex, ma è possibile eseguire ^((part1|part2)|(part1, part2))$. In parole: "parte 1 o parte 2 o entrambi"

9
'^(part1|part2|part1,part2)$' 

funziona?

2

Oppure si può usare questo:

^(?:part[12]|(part)1,\12)$ 
5

fa questo lavoro senza alternanza?

^((part)1(, \22)?)?(part2)?$ 

o perché no?

^((part)1(, (\22))?)?(\4)?$ 

I primi lavori per tutte le condizioni la seconda per tutti, ma part2 (utilizzando GNU sed 4.1.5)

Problemi correlati