2011-11-05 11 views
96

Estoy currentry programando un algoritmo de vocabulario que comprueba si un usuario ha escrito correctamente la palabra. Tengo la siguiente situación: La solución correcta para la palabra sería "part1, part2". El usuario debería poder ingresar "parte1" (respuesta 1), "parte2" (respuesta 2) o "parte1, parte2" (respuesta 3). Ahora intento para que coincida con la cadena dada por el usuario con la siguiente, creado de forma automática, la expresión de expresiones regulares:y/u operador en la expresión regular

^(part1|part2)$ 

Esto sólo vuelve a responder 1 y 2 como respuesta correcta, mientras que 3 sería un error. Ahora me pregunto si hay un operador similar a | que dice "y/o" en lugar de "cualquiera ... o". ¿Alguien me puede ayudar aquí?

+0

expresiones regulares puede no ser la mejor solución para esto. Utilizaría métodos de cuerda normales. –

+1

Este problema está mal especificado. ¿Por qué está usando 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 de la misma manera que lo hace Perl's, en su lugar probablemente deba hacer una prueba contra membresía hash. Otros motores de expresiones regulares no son muy inteligentes en esto. – tchrist

Respuesta

132

Voy a asumir que usted quiere construir una expresión regular de forma dinámica la de contener otras palabras que part1 y part2, y que desea el fin de no tener importancia. Si es así se puede usar algo como esto:

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

positiva coincide:

part1 
part2, part1 
part1, part2, part3 

partidos negativos:

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

Tenga en cuenta que "part1, parte" 1 también será positivo. Lo cual no siempre es deseable – dimaaan

+0

@dimaaan ¿Perdió sus citas? "part1, part1" será una coincidencia, pero "part1, part" no lo será. Aunque está en lo cierto de que tal escenario no está cubierto por esta solución, para la aplicación del OP donde está comprobando si la cadena de prueba consiste en palabras en un vocabulario, creo que sí desea una coincidencia positiva incluso cuando una palabra es repetido. La palabra seguirá siendo parte del vocabulario, no importa cuántas instancias tenga. – Mithon

2

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

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

¿funciona?

2

O puede usar esto:

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

hace este trabajo sin alternancia?

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

o ¿por qué no?

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

Los primeros trabajos para todas las condiciones de la segunda para todos, pero part2 (usando sed de GNU 4.1.5)