Перед словом ".net" нет границы слова, потому что \b
ищет только изменение между \w
и \W
, и оба .
и
(пробел) попадают в категорию \W
, поэтому между ними нет границы.
Один из вариантов - просто искать «не слово-символ», то есть не проверять явно границу, а только отсутствие символа слова, используя отрицательный знакlookbehind:
(?<!\w)
Вы также можете проверить наличие любых символов, не являющихся пробельными символами, например:
(?<!\S)
Это двойное отрицание - может показаться более очевиднымсделайте (?<=\s)
(или (?<=\W)
для предыдущего примера), но это предотвратит совпадения совпадений в начале строки.
Для примера различия между этими двумя - первый совпадет с.NET в C#.NET
, тогда как второй не будет.
Поскольку вы используете регулярное выражение .NET, к счастью, вы получили достаточно полный набор функций регулярного выражения - но стоит отметить, что некоторые другие реализации регулярных выраженийОтношения не поддерживают отрицательный взгляд назад - для них вам необходимо использовать синтаксис, подобный следующему:
(?<=\W|^)
(?<=\s|^)
(Во всех этих случаях вам нужен эквивалентный взгляд на другом конце.)
Итак, вот как эти четыре варианта будут выглядеть в вашем паттерне:
var pattern = @"(?<!\w)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?!\w)";
var pattern = @"(?<!\S)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?!\S)";
var pattern = @"(?<=\s|^)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?=\s|$)";
var pattern = @"(?<=\W|^)(" + keywordExp.Replace(Regex.Escape(searchKeyWord), @"|") + @")(?=\W|$)";