Как написать запрос SQL, который получает все строки с условием 2 в одном столбце

Ваша проблема связана с непониманием того, что на самом деле означает \b. Понятно, что это не очевидно.

Причина \b\(three\)\b не соответствует тройкам в вашей входной строке:

  • \b означает: граница между символом слова слова и символом не-слова .
  • Буквы (например, az) считаются символами слова .
  • Знаки препинания, такие как (, считаются символами без слова .

Вот ваша строка ввода снова, немного растянута, и я отметил места, где \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";

Таким образом, они найдут «(три)», даже если вы выберете только целые слова ».

0
задан Bladeluster 1 March 2019 в 09:15
поделиться