web-dev-qa-db-fra.com

Regex.Match mots entiers

Dans C#, Je veux utiliser une expression régulière pour faire correspondre l'un de ces mots:

string keywords = "(shoes|shirt|pants)";

Je veux trouver les mots entiers dans la chaîne de contenu. Je pensais que ce regex ferait ça:

if (Regex.Match(content, keywords + "\\s+", 
  RegexOptions.Singleline | RegexOptions.IgnoreCase).Success)
{
    //matched
}

mais il renvoie vrai pour des mots comme participants, même si je ne veux que le mot entier pants.

Comment faire correspondre uniquement ces mots littéraux?

47
Kris B

Vous devez ajouter le délimiteur Word à votre expression régulière:

\b(shoes|shirt|pants)\b

Dans du code:

Regex.Match(content, @"\b(shoes|shirt|pants)\b");
85
Philippe Leybaert

Essayer

Regex.Match(content, @"\b" + keywords + @"\b", RegexOptions.Singleline | RegexOptions.IgnoreCase)

\b correspond aux limites de Word. Voir ici pour plus de détails.

13
Ben Lings

Vous avez besoin d'une affirmation de largeur nulle de chaque côté que les caractères avant ou après le mot ne font pas partie du mot:

(?=(\W|^))(shoes|shirt|pants)(?!(\W|$))

Comme d'autres l'ont suggéré, je pense \ b fonctionnera au lieu de (? = (\ W | ^) ) et (?! (\ W | $)) même lorsque le mot se trouve au début ou à la fin de la chaîne d'entrée, mais je ne suis pas sûr.

5
richardtallent

mettre une limite Word dessus en utilisant la métaséquence\b.

1
t3rse