2009-10-16 9 views
5

Uso la siguiente expresión regular para validar una lista de valores separados por comas.¿Hay una expresión regular para una lista separada por comas de valores discretos?

^Dog|Cat|Bird|Mouse(, (Dog|Cat|Bird|Mouse))*$ 

Los valores también se enumeran en una lista desplegable en validación de celda Excel abajo, por lo que el usuario puede seleccionar un solo valor de la lista desplegable, o escribir en varios valores separados por comas.

La expresión regular hace un buen trabajo evitando que el usuario ingrese algo más que los valores aprobados, pero no evita que el usuario ingrese duplicados. Por ejemplo, el usuario puede ingresar "Perro" y "Perro, Gato", pero el usuario también puede ingresar "Perro, Perro".

¿Hay alguna manera de evitar duplicados utilizando una única expresión regular similar? En otras palabras, necesito poder hacer cumplir una lista discreta de valores separados por comas aprobados.

Gracias!

Respuesta

10

Utilice una referencia hacia atrás y una búsqueda negativa hacia delante:

^(Dog|Cat|Bird|Mouse)(, (?!\1)(Dog|Cat|Bird|Mouse))*$ 

EDITAR: Esto no funcionará con casos como "gato, perro, perro" ... Tendrá que llegar a una Solución híbrida para tales casos: no creo que haya una sola expresión regular que pueda manejar eso.


Aquí hay otra técnica. Es necesario comprobar dos cosas, en primer lugar, que no coincide con esta:

(?:(?:^|,)(Dog|Cat|Bird|Mouse))+$ 

(Eso es sólo una versión ligeramente más corto de su expresión regular el original)

A continuación, compruebe que no coincide con esto:

(Dog|Cat|Bird|Mouse).+?\1 

Por ej.

var valid = string.match(/(?:(?:^|,)(Dog|Cat|Bird|Mouse))+$/) && 
      !string.match(/(Dog|Cat|Bird|Mouse).+?\1/); 
+0

Sí, cerca, pero no atrapa "Gato, perro, perro". ¡Gracias! – Kuyenda

+0

No sé si esto funcionaría, pero tal vez puedas hacer la referencia (?! (\ 1 | \ 2 | \ 5 | \ 8) y cambiar el * a 4. Creo que esto podría explotar si Sin embargo, los grupos de captura no existen. No lo intenté, solo un pensamiento. – Tim

+0

¿Por qué "\ 1 \ 2 \ 5 \ 8"? ¿No sería "\ 1 \ 2 \ 3 \ 4"? Gracias ! – Kuyenda

0

J-P, intenté editar sus expresiones regulares de muestra para poder buscar duplicados en cualquier cadena separada por comas. Algo como esto:

var valid = string.match(/(?:(?:^|,)([a-z]*))+$/) && 
    !string.match(/([a-z]*).+?\1/); 

Lamentablemente, he fallado. La Fuerza es débil conmigo. ;)

Gracias de nuevo por su ayuda.

Cuestiones relacionadas