Come viene rappresentato l'operatore AND / OR come nelle espressioni regolari?


219

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 "parte 1, parte 2". L'utente dovrebbe essere in grado di inserire "part1" (risposta 1), "part2" (risposta 2) o "part1, part2" (risposta 3). Ora provo a far corrispondere la stringa fornita dall'utente con la seguente espressione regex creata automaticamente:

^(part1|part2)$

Ciò restituisce solo le risposte 1 e 2 come corrette mentre la risposta 3 sarebbe errata. Mi chiedo ora se esiste un operatore simile a | che dice and/orinvece di either...or.

Qualcuno può aiutarmi a risolvere questo problema?


1
Le espressioni regolari potrebbero non essere la soluzione migliore per questo. Userei i normali metodi di stringa.
Felix Kling,

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

@tchrist Il caso d'uso potrebbe essere una $orpartita regex mongodb
Nadir Abbas,

Risposte:


283

Presumo che tu voglia costruire un regex in modo dinamico per contenere parole diverse dalla parte 1 e dalla parte 2 e che desideri che l'ordine non abbia importanza. Se è così puoi usare qualcosa del genere:

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

Partite positive:

part1
part2, part1
part1, part2, part3

Partite negative:

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

4
Notare che anche "parte 1, parte" 1 sarà positiva. Il che non è sempre desiderabile
dimaaan il

1
@dimaaan Hai smarrito le tue citazioni? "part1, part1" sarà una corrispondenza, ma "part1, part" non lo sarà. Anche se hai ragione che un tale scenario non è coperto da questa soluzione, per l'applicazione dell'OP in cui sta verificando se la stringa di test è composta da parole in un vocabolario, credo che voglia una corrispondenza positiva anche quando una parola è ripetuto. La parola farà ancora parte del vocabolario, indipendentemente da quanti casi ne hai.
Gaute Løken,

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

funziona?


1
Ovviamente. il regex richiede che l'intera stringa corrisponda (^, $)
glasspill il

5

Funziona senza alternanza?

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

o perché non questo?

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

Il primo funziona per tutte le condizioni, il secondo per tutti ma part2(usando GNU sed 4.1.5)


4

Non un esperto di regex, ma puoi farlo ^((part1|part2)|(part1, part2))$. In parole: "parte 1 o parte 2 o entrambi"


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.