Su problema se deriva de una mala interpretación de lo que significa en realidad \b
. Es cierto que no es obvio.
La razón \b\(three\)\b
no coincide con los tríos en su cadena de entrada es la siguiente:
\b
significa: el límite entre un personaje palabra y un carácter no-palabra.
- Las letras (por ejemplo, a-z) se consideran caracteres de palabra.
- Los signos de puntuación como
(
se consideran caracteres sin palabra.
Aquí es su cadena de entrada de nuevo, estiró un poco, y he marcado los lugares donde \b
partidos
o n e t w o (t h r e e) (t h r e e) f o u r f i v e
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
Como se puede ver aquí, hay un \b
entre “dos” y "(tres)", pero no antes del segundo "(tres)".
¿La moraleja de la historia? La "búsqueda de palabras completas" no tiene mucho sentido si lo que estás buscando no es solo una palabra (una cadena de letras). Como tiene caracteres de puntuación (paréntesis) en su cadena de búsqueda, no es como tal una "palabra". Si buscó una palabra que consta únicamente de caracteres de palabra, entonces \b
haría lo que esperaba.
Usted puede, por supuesto, utilizar una expresión regular para emparejar la cadena sólo si rodeado de espacios o se produce al principio o al final de la cadena:
(^|\s)\(three\)(\s|$)
Sin embargo, el problema con esto es, por supuesto, si busca "tres" (sin los paréntesis), no encontrará el que está en "(tres)" porque no tiene espacios alrededor, aunque en realidad es una palabra completa.
creo que la mayoría de los editores de texto (incluyendo Visual Studio) usarán \b
sólo si la cadena de búsqueda en realidad comienza y/o termina con un carácter de palabra:
var pattern = Regex.Escape(searchString);
if (Regex.IsMatch(searchString, @"^\w"))
pattern = @"\b" + pattern;
if (Regex.IsMatch(searchString, @"\w$"))
pattern = pattern + @"\b";
De esa manera se van a encontrar “(tres)” incluso si selecciona "palabras completas solamente".
Cualquier cosa cada lado de una (o) será automáticamente un límite de la palabra, porque no es entre dos caracteres de palabra – Gareth