2012-01-13 22 views
8

Ok, ahora me siento bastante grueso. Básicamente, quiero definir una expresión regular de JavaScript que coincida con cualquier cosa excepto precisamente una cadena en particular. Así que decir que tengo la cadenaDefinir una expresión regular de JavaScript que coincida con cualquier cosa excepto una cadena en particular

"dog" 

o

"cat" 

quiero una sola expresión regular independiente de tal manera que coincidirá con una cadena

"dogsled" 

o la cadena

"cattle" 

Simplemente no "perro" o "gato" en él propio. He intentado esto, que básicamente dice, ignorar todo lo que empieza con "gato" o "perro", que no es exactamente lo que necesito ...

var pattern= /^(?!dog|cat).+/ 

pattern.test("cat") // false, as expected 
pattern.test("dog") // false, as expected 
pattern.test("bananananana") // true 
pattern.test("dogsled") // false, but the regexp I want would return true 

Esto tiene que ser simple .... gracias!

Editar Solo para aclarar, yo no quiero hacer ninguna negación de los valores de retorno para obtener el resultado que quiero- la expresión regular debe devolver false para "perro" y cierto para "trineo" o falsa para " gato" y cierto para 'ganado'

+2

+1 por dar realmente la expresión regular. Tantas preguntas [tag: regex] son ​​solo estilo "I can has code". – Matt

+4

¿Por qué no simplemente negar? '! string.match (/^dog | cat $ /)' –

+0

@LinusKleen ja, ja, ja gran nombre de usuario para una pregunta regex :-) – Pointy

Respuesta

6

optaría por el simple negación de un partido como se señala en Linus Kleen's answer. Sin embargo, si es absolutamente necesario hacerlo todo en expresiones regulares (o de la experiencia de aprendizaje o algo así), entonces creo que el siguiente debería funcionar:

^((dog|cat(?!$)).+|(?!dog|cat).+)$ 

Este utiliza dos símbolos de anticipación negativos en una alternancia. El primero dice "Coincidir con cat o dog si no va seguido del final del carácter de cadena ($), seguido de cualquier otra cosa". Esto coincide con dogsled y cats y cosas de esa naturaleza.

La segunda mitad de la alternancia dice "Asegúrese de que el principio de la cadena (^) no es seguida por dog o cat (por lo que no se inicia con cualquiera de esos), a continuación, coincide nada". Esto le da una palabra que no comienza con cat o dog (como banana).

Here's an example on regexpal.

+0

Excelente. Más dos (si pudiera). –

+0

@ eldarerathis- el requisito para la coincidencia de expresiones regulares solo se debe a las restricciones de integración, ¡y esto se adapta muy bien! La simple negación también habría sido mi preferencia, pero esto funciona. ¡Gracias! – VLostBoy

0

creo que esto debería hacer el truco:

/^(dog|cat)?.+/ 
+0

Esto coincide con ambos 'perro' y 'gato'. – eldarerathis

+0

Casi- esto satisface el caso inverso ... – VLostBoy

4

me parece recordar las afirmaciones de preanálisis negativos ((?! ...)) a no ser totalmente compatible con todos los intérpretes de JavaScript. Una simple negación sobre el resultado de la expresión regular también debería ser suficiente, ¿no?

var pattern = /^cat|dog$/; 

!pattern.test("cat");   // => false 
!pattern.test("dog");   // => false 
!pattern.test("bananananana"); // => true 
!pattern.test("dogsled");  // => true 
+0

¿De verdad? Sé que JavaScript no es compatible con lookbehinds, pero no estaba al tanto de ningún problema con los lookaheads (positivos o negativos). – Wiseguy

+0

más uno para un buen análisis del problema real – davogotland

Cuestiones relacionadas