2011-10-06 6 views
4

Comment puis-je écrire un modèle de RegEx pour tester si une chaîne contient plusieurs sous-chaînes avec la structure:JavaScript RegEx excluant certains mots/expressions?

"cake.xxx" 

où xxx est quoi que ce soit, mais pas « fromage » ou « lait » ou « beurre ».

Par exemple:

  • "I have a cake.honey and cake.egg" devrait retourner true, mais
  • "I have a cake.**milk** and cake.egg" devrait revenir false.

Répondre

13

Est-ce ce que vous voulez?

^(?!.*cake\.(?:milk|butter)).*cake\.\w+.* 

Voir ce here on Regexr

cette correspondra à la ligne complète si elle contient un "cake.XXX" mais pas lorsque son "cake.milk" ou "cake.butter"

.*cake\.\w+.* Cette une partie correspondra s'il y a un "gâteau". suivi d'au moins un caractère Wrod.

(?!.*cake\.(?:milk|butter)) c'est un négatif préanalyse, cela empêchera correspondant si la chaîne contient un des mots que vous ne permettez pas

^ ancre le modèle au début de la chaîne

+0

Je me demande pourquoi c'est (?: Lait | beurre) mais pas (lait | beurre) ??? –

+1

C'est juste un groupe qui ne capture pas à cause du '?:'. La seule différence est que la chaîne correspondante n'est PAS stockée dans une variable. – stema

+0

Cela signifie que je peux utiliser (lait | beurre) à la place, non? Et plus, est-ce nécessaire de mettre la règle "lookahead négatif" juste après la marque de début de chaîne "^"? –

1

caractères regex (comme * , +, ? et {0}) appliquent seulement au dernier caractère

vous devez mettre le mot ou la phrase dans un non-matching group, comme ceci:

(?:someWord){0} signifie someWord est répété (existe) 0 fois, sans le mettre dans vos matchs

(?!someWord) fait la même chose


regex101 est un bon terrain de jeu pour les tests regex et de voir la répartition

Questions connexes