Ваша проблема связана с непониманием того, что на самом деле означает \b
. Понятно, что это не очевидно.
Причина \b\(three\)\b
не соответствует тройкам в вашей входной строке:
\b
означает: граница между символом слова слова и символом не-слова . (
, считаются символами без слова . Вот ваша строка ввода снова, немного растянута, и я отметил места, где \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
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
Как вы можете видеть здесь, есть \b
между «двумя» и «(тремя)», но не раньше второй "(три)".
Мораль истории? «Поиск целых слов» на самом деле не имеет большого смысла, если то, что вы ищете, - это не просто слово (строка букв). Поскольку в строке поиска есть знаки пунктуации (круглые скобки), это не такое «слово». Если вы искали слово, состоящее только из символов слова , то \b
будет делать то, что вы ожидаете.
Вы можете, конечно, использовать другое Regex для соответствия строке только если он окружен пробелами или встречается в начале или в конце строки:
(^|\s)\(three\)(\s|$)
Однако проблема с этим, конечно, заключается в том, что если вы ищете «три» (без круглых скобок ), он не найдет тот, что находится в «(три)», потому что на нем нет пространств, хотя это фактически целое слово.
Я думаю, что большинство текстовых редакторов (включая Visual Studio ) будет использовать \b
только в том случае, если ваша строка поиска действительно начинается и / или заканчивается символом слова:
var pattern = Regex.Escape(searchString);
if (Regex.IsMatch(searchString, @"^\w"))
pattern = @"\b" + pattern;
if (Regex.IsMatch(searchString, @"\w$"))
pattern = pattern + @"\b";
Таким образом, они найдут «(три)», даже если вы выберете только целые слова ».
Это то, что вы хотите?
Select * from
(
select a.* from tbl a join tbl b
on a.ID = b.ID
where
a.Type = 'Name' and b.Type = 'Text'
) tb
where tb.Type = 'Name'