Your problem stems from a misunderstanding of what
actually means. Admittedly, it is not obvious.
The reason (three)
doesn’t match the threes in your input string is the following:
means: the boundary between a word character and a non-word character.
- Letters (e.g. a-z) are considered word characters.
- Punctuation marks such as
(
are considered non-word characters.
Here is your input string again, stretched out a bit, and I’ve marked the places where
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
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
As you can see here, there is a
between “two” and “(three)”, but not before the second “(three)”.
The moral of the story? “Whole-word search” doesn’t really make much sense if what you’re searching for is not just a word (a string of letters). Since you have punctuation characters (parentheses) in your search string, it is not as such a “word”. If you searched for a word consisting only of word characters, then
would do what you expect.
You can, of course, use a different Regex to match the string only if it surrounded by spaces or occurs at the beginning or end of the string:
(^|s)(three)(s|$)
However, the problem with this is, of course, that if you search for “three” (without the parentheses), it won’t find the one in “(three)” because it doesn’t have spaces around it, even though it is actually a whole word.
I think most text editors (including Visual Studio) will use
only if your search string actually starts and/or ends with a word character:
var pattern = Regex.Escape(searchString);
if (Regex.IsMatch(searchString, @"^w"))
pattern = @"" + pattern;
if (Regex.IsMatch(searchString, @"w$"))
pattern = pattern + @"";
That way they will find “(three)” even if you select “whole words only”.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…