Come faccio a invertire un'espressione regolare in JavaScript?
-
20-09-2019 - |
Domanda
Ho una stringa A e voglio verificare se un'altra stringa B non è parte di esso. Questo è veramente semplice espressione regolare il cui risultato può essere invertito in seguito.
che potevo fare:
/foobar/.test('foobar@bar.de')
e capovolgere subito dopo, in questo modo:
!(/foobar/).test('foobar@bar.de')
Il problema che ho è, che ho bisogno di farlo all'interno dell'espressione regolare e non con il loro risultato. Qualcosa di simile:
/!foobar/.test('foobar@bar.de')
(che non funziona)
In altre parole:. L'espressione regolare deve testare per un non-esistenza e return true in questo caso
Questo è possibile con JavaScript?
Soluzione
Prova:
/^(?!.*foobar)/.test('foobar@bar.de')
A (breve) spiegazione:
^ # start of the string
(?! # start negative look-ahead
.* # zero or more characters of any kind (except line terminators)
foobar # foobar
) # end negative look-ahead
Quindi, in parole povere, che regex sarà dall'inizio della stringa se la stringa 'foobar' può essere "visto". Se può essere "visto" non v'è non * partita.
* non può competere perché è negativo look-ahead!
Ulteriori su questi roba look-ahead: http://www.regular-expressions.info/ lookaround.html Ma noti che JavaScript supporta solo look-aheads, nessun look- behinds
Altri suggerimenti
^(?!.*(word1|word2|word3))
abbinerà una stringa che non contiene nessuna delle word1
, word2
o word3
(e si può estendere l'elenco a tempo indeterminato).
Ma questo corrisponde anche stringhe nulle. Per rifiutare i null uso
^(?!$)(?!.*(word1|word2|word3))
Ecco un esempio di una disuguaglianza. Per prima cosa ho isolare l'operatore '<', poi gli operandi 'a' e 'b'. Fondamentalmente, prendo l'espressione diretta, includo in parentesi destra, invertire il secondo di '^' e infine incorporare l'espressione risultante in parentesi quadre, 'causare il '^' all'inizio verrebbe interpretato in modo diverso.
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 .: Ho appena aggiunto lo spazio vuoto nell'espressione inversa, al fine di recuperare la corrispondenza esatta per gli operandi.
Se state cercando davvero non è più complicato di una semplice stringa come "foobar":
if (yourString.indexOf("foobar") === -1) {
// ...
}