Votre problème vient d'une mauvaise compréhension de ce que signifie réellement \b
. Certes, ce n'est pas évident.
La raison \b\(three\)\b
ne correspond pas aux groupes de trois dans votre chaîne d'entrée est la suivante:
\b
signifie: la frontière entre un caractère de mot et un caractère non-mot.
- Des lettres (par exemple a-z) sont considérées comme caractères de mot.
- Les signes de ponctuation tels que
(
sont considérés comme caractères non-mots.
Voici votre chaîne d'entrée à nouveau, étiré un peu, et je l'ai marqué les endroits où \b
matches:
o n e t w o (t h r e e) (t h r e e) f o u r f i v e
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
Comme vous pouvez le voir ici, il y a un \b
entre « deux » et "(trois)", mais pas avant le second "(trois)".
La morale de l'histoire? La recherche de mots entiers n'a pas vraiment de sens si ce que vous recherchez n'est pas juste un mot (une série de lettres). Puisque vous avez des signes de ponctuation (parenthèses) dans votre chaîne de recherche, ce n'est pas un "mot". Si vous avez recherché un mot composé uniquement de caractères de mot, alors \b
ferait ce que vous attendez.
Vous pouvez, bien sûr, utiliser un autre Regex pour correspondre à la chaîne que si elle entourée par des espaces ou se produit au début ou à la fin de la chaîne:
(^|\s)\(three\)(\s|$)
, le problème est cependant, Bien sûr, si vous cherchez "trois" (sans les parenthèses), il ne trouvera pas celui de "(trois)" parce qu'il n'a pas d'espace autour de lui, même s'il s'agit en fait d'un mot entier.
Je pense que la plupart des éditeurs de texte (y compris Visual Studio) utiliseront \b
uniquement si votre chaîne de recherche commence réellement et/ou se termine par un mot:
var pattern = Regex.Escape(searchString);
if (Regex.IsMatch(searchString, @"^\w"))
pattern = @"\b" + pattern;
if (Regex.IsMatch(searchString, @"\w$"))
pattern = pattern + @"\b";
De cette façon, ils trouveront « (trois) » même si vous sélectionnez "mots entiers seulement".
Tout part et d'autre d'un (ou) sera automatiquement une limite de mot, parce que ce n'est pas entre deux caractères de mot – Gareth