2009-10-08 19 views
33

Tengo una cadena A y quiero probar si otra cadena B no es parte de ella. Esta es una expresión regular simple muy cuyo resultado se puede invertir después.¿Cómo puedo invertir una expresión regular en JavaScript?

que podía hacer:

/foobar/.test('[email protected]') 

y invertirla después, como esto:

!(/foobar/).test('[email protected]') 

El problema que tengo es, que tengo que hacerlo dentro de la expresión regular y no con su resultado. Algo así como:

/!foobar/.test('[email protected]') 

(que no funciona)

En otras palabras: la expresión regular debe probar para un no-existencia y de vuelta verdad en ese caso.

¿Es esto posible con JavaScript?

Respuesta

44

Probar:

/^(?!.*foobar)/.test('[email protected]') 

A (corto) Explicación:

^   # start of the string 
(?!  # start negative look-ahead 
    .*  # zero or more characters of any kind (except line terminators) 
    foobar # foobar 
)   # end negative look-ahead 

Así, en la llanura Inglés, que de expresiones regulares se mira desde el inicio de la cadena si la cadena 'foobar' puede ser "visto". Si se puede "ver", hay no coincide con *.

* no coincidencia porque es negativo look-ahead!

Más sobre este aspecto anticipado: http://www.regular-expressions.info/lookaround.html Pero tenga en cuenta que JavaScript solo es compatible con look-aheads, no mira-detrás de!

+0

Bien, ¿podría explicar eso? – jantimon

+0

Thx que nunca he visto? antes de. Gran respuesta – jantimon

+0

Genial, esto era exactamente lo que necesitaba. No he intentado el lookahead negativo en JavaScript antes. ¡Muchas gracias! – acme

0

Si lo que estás buscando en realidad no es más complicado que una simple cadena como "foobar":

if (yourString.indexOf("foobar") === -1) { 
    // ... 
} 

http://www.w3schools.com/jsref/jsref_indexOf.asp

+0

Gracias, pero tiene que ser una expresión regular, simplemente simplifiqué un poco el ejemplo. – acme

+0

o yourString.includes ("foobar") :) – rogerdpack

0
^(?!.*(word1|word2|word3)) 

coincidirá con una cadena que no contiene ningún de word1, word2, o word3 (y puede extender la lista indefinidamente). Pero esto también coincide con cadenas nulas. Para rechazar valores nulos, use

^(?!$)(?!.*(word1|word2|word3)) 
1

Aquí hay un ejemplo de desigualdad. Primero aísto el operador '<', luego los operandos 'a' y 'b'. Básicamente, tomo la expresión directa, la incluyo en paréntesis derechos, invierto la última por '^' y finalmente incrusto la expresión resultante entre corchetes, porque '^' al comienzo se interpretaría de manera diferente.

var _str = "a < b" ; 
var _op = /</g ; 
var _no_op = /[^(<|\)]/g ; 
console.log(_str, _str.match(_op)); // get '<' 
console.log(_str, _str.match(_no_op)); // get 'a', 'b' 

P.s .: Acabo de añadir el espacio en blanco en la expresión inversa, con el fin de recuperar la coincidencia exacta de los operandos.

Cuestiones relacionadas