Regex pour faire correspondre tout sauf deux mots

j'essaie d'écrire une expression régulière pour faire correspondre tout ce qui n'est pas" foo "et"bar". J'ai trouvé comment faire correspondre n'importe quoi sauf un mot à Expression régulière pour correspondre à une ligne qui ne contient pas un mot? mais je ne suis pas très habile avec regex et je ne sais pas comment ajouter un second mot à ce critère.

toute aide serait la plus appréciée!

CLARIFICATION:

je voulais correspondre sur n'importe quoi ce n'était pas exactement foo ou bar.

27
demandé sur Community 2011-07-26 17:33:50

3 réponses

réponse à la question:" une expression régulière pour faire correspondre tout ce qui n'est pas "foo" et "bar"?"

^(?!foo$|bar$).*

ferait exactement ça.

^      # Start of string
(?!    # Assert that it's impossible to match...
 foo   # foo, followed by
 $     # end of string
|      #
 bar$  # bar, followed by end of string.
)      # End of negative lookahead assertion
.*     # Now match anything

vous pourriez avoir besoin de définir RegexOptions.Singleline si votre chaîne de caractères peut contenir des nouvelles lignes que vous souhaitez également correspondre.

67
répondu Tim Pietzcker 2011-07-26 13:51:29

réponse à la question: "Comment ajouter un second mot à ce critère ?"

la réponse à la question que vous liez est:

^((?!word).)*$

(?!word) est un regard négatif. La réponse à cette question Est:

^((?!wordone|wordtwo).)*$

Fonctionne pour les deux mots. Note: vous devez activer le global et multiline options, si vous avez plusieurs lignes et souhaitez faire correspondre pour chaque ligne, comme l'autre question.

la différence est la clause de prévision négative: (?!wordone|wordtwo) . Elle peut être étendue à n'importe quelle quantité (raisonnable) de mots ou de clauses.

Voir cette réponse pour une explication détaillée.

18
répondu Pindatjuh 2017-05-23 12:17:59

j'obtiens ce que vous voulez faire, mais les détails de ce que vous voulez bloquer/autoriser sont un peu imprécis. Par exemple, voulez-vous bloquer tout ce qui n'est pas exactement foo ou bar ? Ou voulez-vous bloquer quelque chose contenant ces deux cordes?

peuvent-ils faire partie d'une autre chaîne, comme dans les exemples foonly ou bartender de @Tim?

je suis je vais juste suggérer des modèles pour chacun d'eux:

/^(?!foo$|bar$).*/   #credit to @Tim Pietzcker for this one, he did it first
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #allows "hello foo goodbye"
    #allows "foogle"
    #allows "foobar"

/^(?!.*foo|.*bar).*$/
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #blocks "hello foo goodbye"
    #blocks "foogle"
    #blocks "foobar"

/^(?!.*\b(foo|bar)\b).*$/
    #blocks "foo"
    #blocks "bar"
    #allows "hello goodbye"
    #blocks "hello foo goodbye"
    #allows "foogle"
    #allows "foobar"
6
répondu Justin Morgan 2011-07-26 13:59:14