Jak mohu invertovat regulární výraz v JavaScriptu?

Mám řetězec A a chci vyzkoušet, zda jeho součástí není jiný řetězec B. Toto je velmi jednoduchý regulární výraz, jehož výsledek lze později invertovat.

Mohl bych:

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

a poté jej invertujte takto:

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

Problém, který mám, je, že to musím udělat v rámci regulárního výrazu a ne s jejich výsledkem. Něco jako:

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

(což nefunguje)

Jinými slovy:regulární výraz by měl otestovat neexistenci a v takovém případě vrátit hodnotu true.

Je to možné pomocí JavaScriptu?

Odpověď

Zkuste:

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

(krátké) vysvětlení:

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

Takže v jednoduché angličtině bude tento regulární výraz vypadat od začátku řetězce, pokud lze „vidět“ řetězec „foobar“. Pokud to lze „vidět“, neexistuje ne * shoda.

* žádná shoda, protože je záporná dívej se dopředu!

Více o těchto předběžných položkách:http://www.regular-expressions.info/lookaround.html Upozorňujeme však, že JavaScript podporuje pouze předběžné pohledy, žádné pohledy-pozadí !