2016-08-01 2 views
2

J'essaye de mettre en place un motif regex qui correspond à une chaîne qui contient le mot "front" et ne contient pas le mot "square". Je peux accomplir ceci individuellement, mais j'ai du mal à les assembler.javascript regex: string contient ceci, mais pas cela

avant = OUI

^((?=front).)*$ 

carré = NO

^((?!square).)*$ 

Cependant, comment je combiner en tant que seule expression regex?

+2

Les réponses ici ont raison, mais pourquoi utiliser une expression régulière? Pourquoi ne pas simplement '(text.indexOf ('front')> = 0) && (text.indexOf ('square') === -1)'? – smarx

+1

Ou l'ES6 'text.includes (" front ") &&! Text.includes (" square ")' (mais ce n'est pas encore complètement supporté) – Arnauld

Répondre

2

Vous pouvez utiliser un seul test avant négatif pour cela:

/^(?!.*square).*front/ 
  • (?!.*square) est préanalyse négative d'affirmer l'échec si square est présent partout dans l'entrée
  • ^.*front correspondra front partout dans l'entrée
+0

Merci pour ça! Et si je voulais tester si ça les contenait tous les deux, dans n'importe quel ordre? –

+0

[Vérifier cette démo] (https://regex101.com/r/fY0yW6/1) – anubhava

+0

'si elle les avait tous les deux, dans n'importe quel ordre', alors utilisez **' /^(?=.* carré) (? =. * avant)/'** – anubhava

0

Vous pouvez utiliser des assertions lookahead pour exprimer la logique et:

Le motif final ressemblerait que:

^(?=.*?front)(?!.*square)