你的问题源于对 \b
的实际含义的误解。不可否认地,这并不明显。
\b\(three\)\b
无法匹配你的输入字符串中的“three”的原因如下:
\b
表示:一个单词字符和一个非单词字符之间的边界。
- 字母 (例如 a-z) 被视为单词字符。
- 标点符号,如
(
被视为非单词字符。
下面是您的输入字符串,稍微拉长一点,并标出了\b
匹配的位置:
o n e t w o ( t h r e e ) ( t h r e e ) f o u r f i v e
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
正如您在这里看到的,"two" 和 "(three)" 之间有一个
\b
,但在第二个 "(three)" 前面没有。
故事的寓意是什么?如果你要搜索的不仅仅是一个单词(一串字母),那么“全词搜索”就没有太多意义了。由于你的搜索字符串中有标点符号(括号),所以它并不是一个“单词”。如果你只搜索由
单词字符组成的单词,那么
\b
会做你期望的事情。
当然,您可以使用不同的正则表达式来匹配字符串,只有在被空格包围或出现在字符串的开头或结尾时才匹配:
(^|\s)\(three\)(\s|$)
然而,这样的问题是,如果您搜索“three”(不带括号),它将无法找到“(three)”中的一个,因为它周围没有空格,即使它实际上是一个完整的单词。
我认为大多数文本编辑器(包括Visual Studio)只会在您的搜索字符串实际上以单词字符开头和/或结尾时使用\b。
var pattern = Regex.Escape(searchString);
if (Regex.IsMatch(searchString, @"^\w"))
pattern = @"\b" + pattern;
if (Regex.IsMatch(searchString, @"\w$"))
pattern = pattern + @"\b";
那样的话,即使你选择“仅整个单词”,他们也会找到“(三)”。