Very simple regex not working

I have read that to match a word inside of a string using Regular expressions (in .NET), I can use the word boundary specifier (\b) within the regex. However, none of these calls result in any matches

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\b@p1\b");

Regex.Match("INSERT INTO TEST(Col1,Col2) VALUES(@p1,@p2)", @"\bINSERT\b");

Is there anything I am doing wrong ?

EDIT: The second one is already working ;)

6
задан Wiktor Stribiżew 22 February 2019 в 11:14
поделиться

3 ответа

Update: Как отметил другой ответ, @ не является символом слова, поэтому между @ и пробелом нет границы слова. В качестве обходного пути можно использовать отрицательный lookbehind:

@"(?<!\w)@p1\b"

Оригинальный ответ: Вам нужен @ перед регулярными выражениями:

@"\b@p1\b"

Без этого строка "\b" интерпретируется как пробел (символ 8), а не как граница слова регулярного выражения. Более подробная информация о @-quoted string литералах есть на MSDN.

Альтернативный способ не использовать @-кавычки в строковых литералах - экранировать обратные слеши:

"\\b@p1\\b"
10
ответ дан 8 December 2019 в 16:00
поделиться

В ваших строках экранируется \ - вам нужно использовать строковые литералы, чтобы избежать этого:

@"\bINSERT\b"

Иначе regex увидит "bINSERTb".

1
ответ дан 8 December 2019 в 16:00
поделиться

Второй случай решается с помощью @ "\ bINSERT \ b" , как указано в другом ответе.

Однако / b соответствует адресу:

  • Перед первым символом в строке , если первый символ является словесным символом .
  • После последнего символа в строке , если последний символ является символом слова .
  • Между двумя символами в строке, где один является словесным символом, а другой не является словесным символом.

Словесный символ является одним из [a-zA-Z0-9 _] , поэтому первый случай нельзя разрешить, добавив префикс @ , чтобы избежать \ b ], потому что вы пытаетесь сопоставить не словарный символ ( @ ).


Обновление: Первый случай может быть решен с помощью утверждения отрицательного ретроспективного просмотра, а также с помощью отрицательной границы слова \ B , что приводит к более чистому синтаксису ( @ "\ B @ p1 \ b" ).

4
ответ дан 8 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: