web-dev-qa-db-fra.com

Expression régulière pour exclure un ensemble de mots-clés

Je veux une expression qui échouera lorsqu'elle rencontrera des mots tels que "boon.ini" et "http". L'objectif serait de prendre cette expression et de pouvoir construire n'importe quel ensemble de mots-clés.

45
kae
^(?:(?!boon\.ini|http).)*$\r?\n?

(extrait de la bibliothèque de RegexBuddy ) correspondra à toute ligne ne contenant pas boon.ini et/ou http. C'est ce que tu voulais?

46
Tim Pietzcker

Une expression alternative qui pourrait être utilisée:

^(?!.*IgnoreMe).*$

^ = indique le début de la ligne 
$ = indique la fin de la ligne 
(?! Expression) = indique une largeur nulle, recherche d'une correspondance négative sur l'expression

Le ^ au début est nécessaire, sinon, une fois analysé, le regard négatif à venir pourrait commencer quelque part dans/au-delà du texte "IgnoreMe" - et créer une correspondance là où vous ne le souhaitez pas.

par exemple. Si vous utilisez la regex: 

(?!.*IgnoreMe).*$

Avec l'entrée "Hello IgnoreMe Please", vous obtiendrez quelque chose comme: "gnoreMe Please" car la recherche négative à venir révèle qu'il n'existe pas de chaîne complète "IgnoreMe" après le "I".

14
Tim

Plutôt que de nier le résultat dans l'expression, vous devriez le faire dans votre code. De cette façon, l'expression devient assez simple.

\b(boon\.ini|http)\b

Renverrait true si boon.ini ou http se trouvait n'importe où dans votre chaîne. Il ne correspondra pas à des mots tels que httpd ou httpxyzzy à cause des limites \b ou Word. Si vous le souhaitez, vous pouvez simplement les supprimer et cela correspond à ceux-là aussi. Pour ajouter plus de mots-clés, ajoutez simplement plus de pipes.

\b(boon\.ini|http|foo|bar)\b
13
Justin Poliey

vous pourriez être bien servi en écrivant une regex qui réussira lorsqu'il rencontrera les mots que vous recherchez, puis inversera la condition.

Par exemple, en Perl, vous utiliseriez:

if (!/boon\.ini|http/) {
    # the string passed!
}
4
Nathan Fellman
^[^£]*$

L'expression ci-dessus limitera uniquement le symbole dièse de la chaîne. Cela autorisera tous les caractères sauf chaîne.

2
Manikandan

Quelle bibliothèque de langue/regexp? Je pensais que votre question concernait ASP.NET. Dans ce cas, vous pouvez voir la section "Lookhead négatif" de cet article: http://msdn.Microsoft.com/en-us/library/ms972966.aspx

À proprement parler, la négation d'une expression régulière définit encore un langage ordinaire, mais il existe très peu de bibliothèques/langages/outils permettant de l'exprimer.

Lookahed négatif peut vous servir la même chose, mais la syntaxe réelle dépend de ce que vous utilisez. La réponse de Tim est un exemple avec (?...)

1
Remo.D

J'ai utilisé cette option (sur la base de la réponse Tim Pietzcker) pour exclure les URL de sous-domaine non productifs pour les filtres de profil Google Analytics:

^\w+-*\w*\.(?!(?:alpha(123)*\.|beta(123)*\.|preprod\.)domain\.com).*$

Vous pouvez voir le contexte ici: Regex pour exclure plusieurs mots

0
Jon Kern