¿Cómo se representa el operador AND / OR como en Expresiones regulares?

219

Actualmente estoy programando un algoritmo de vocabulario que verifica si un usuario ha escrito la palabra correctamente. Tengo la siguiente situación: La solución correcta para la palabra sería "parte1, parte2". El usuario debe poder ingresar "parte1" (respuesta 1), "parte2" (respuesta 2) o "parte1, parte2" (respuesta 3). Ahora trato de hacer coincidir la cadena dada por el usuario con la siguiente expresión regex creada automáticamente:

^(part1|part2)$

Esto solo devuelve la respuesta 1 y 2 como correcta, mientras que la respuesta 3 sería incorrecta. Ahora me pregunto si hay un operador similar a | dice que and/oren lugar de either...or.

¿Alguien puede ayudarme a resolver este problema?

Jonathan
fuente
1
Las expresiones regulares pueden no ser la mejor solución para esto. Usaría métodos de cadena normales.
Felix Kling
3
Este problema está mal especificado. ¿Por qué utiliza la coincidencia de patrones cuando todo lo que necesita es una comparación exacta de cadenas con un conjunto de cadenas legales? A menos que su compilador de expresiones regulares optimice las alternativas en una estructura O (1) trie como lo hace Perl's, probablemente debería hacer una prueba contra la membresía hash. Otros motores regex simplemente no son muy inteligentes en esto.
tchrist
@tchrist El caso de uso podría ser un $orpartido de mongodb regex
Nadir Abbas

Respuestas:

283

Voy a suponer que desea construir una expresión regular dinámicamente para contener otras palabras que no sean parte1 y parte2, y que desea que el orden no importe. Si es así, puede usar algo como esto:

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

Partidos positivos:

part1
part2, part1
part1, part2, part3

Partidos negativos:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1
Gaute Løken
fuente
44
Tenga en cuenta que "parte1, parte" 1 también será positivo. Lo que no siempre es deseable
dimaaan
1
@dimaaan ¿Perdiste tus citas? "parte1, parte1" será una coincidencia, pero "parte1, parte" no lo será. Aunque tiene razón en que esta solución no cubre tal escenario, para la aplicación del OP donde está comprobando si la cadena de prueba consta de palabras en un vocabulario, creo que él quiere una coincidencia positiva incluso cuando una palabra es repetido. La palabra seguirá siendo parte del vocabulario, sin importar cuántas instancias tenga.
Gaute Løken
30
'^(part1|part2|part1,part2)$'

¿Funciona?

Kent
fuente
1
Obviamente. la expresión regular requiere que toda la cadena coincida (^, $)
glasspill
5

¿Esto funciona sin alternancia?

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

o por qué no esto?

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

El primero funciona para todas las condiciones, el segundo para todos pero part2(usando GNU sed 4.1.5)

potong
fuente
4

No es un experto en expresiones regulares, pero puedes hacerlo ^((part1|part2)|(part1, part2))$. En palabras: "parte 1 o parte2 o ambas"

Oso negro
fuente
2

O puedes usar esto:

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