Como posso inverter uma expressão regular em JavaScript?
-
20-09-2019 - |
Pergunta
Eu tenho uma string a e quero testar se outra string b não faz parte dela. Este é um regex muito simples cujo resultado pode ser invertido posteriormente.
Eu poderia fazer:
/foobar/.test('foobar@bar.de')
e invertê -lo depois, assim:
!(/foobar/).test('foobar@bar.de')
O problema que tenho é que preciso fazê -lo dentro da expressão regular e não com o resultado deles. Algo como:
/!foobar/.test('foobar@bar.de')
(que não funciona)
Em outras palavras: a expressão regular deve testar uma inexistência e retornar verdadeiro nesse caso.
Isso é possível com JavaScript?
Solução
Tentar:
/^(?!.*foobar)/.test('foobar@bar.de')
Uma explicação (curta):
^ # start of the string
(?! # start negative look-ahead
.* # zero or more characters of any kind (except line terminators)
foobar # foobar
) # end negative look-ahead
Então, em inglês simples, que Regex olhará desde o início da string se a string 'Foobar' puder ser "vista". Se pode ser "visto", existe não* Combine.
* sem correspondência porque é negativo olhe para frente!
Mais sobre essa aparência seguida: http://www.regular-expressions.info/lookAround.html Mas observe que o JavaScript suporta apenas a aparência, sem olhar-atrasado!
Outras dicas
^(?!.*(word1|word2|word3))
corresponderá a uma string que não contém nada word1
, word2
, ou word3
(e você pode estender a lista indefinidamente). Mas isso também corresponde às cordas nulas. Para rejeitar os nulos de uso
^(?!$)(?!.*(word1|word2|word3))
Aqui está um exemplo de desigualdade. Primeiro, isole o operador '<', mais tarde os operandos 'a' e 'b'. Basicamente, tomo a expressão direta, incluo -a nos parênteses certos, inverto o último por '^' e finalmente incorporo a expressão resultante em colchetes, porque o '^' no início seria interpretado de maneira 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'
PS: Acabei de adicionar o espaço em branco na expressão inversa, a fim de recuperar a correspondência exata para os operando.
Se o que você está procurando realmente não é mais complicado do que uma corda simples como "Foobar":
if (yourString.indexOf("foobar") === -1) {
// ...
}