Очень простое регулярное выражение не работает

У меня читать, чтобы соответствовать слову внутри строки, используя регулярные выражения (в .NET), я могу использовать границу слова specifier (\b) в регулярном выражении. Однако ни одно из этих вызовов не приводит к каким-либо совпадениям

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

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

Есть ли что-то, что я делаю неправильно?

EDIT: Второй уже работает;)

Ответ 1

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

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

Исходный ответ: перед вашими регулярными выражениями нужно @:

@"\[email protected]\b"

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

Альтернативный способ без использования строковых литералов @-quoted состоит в том, чтобы избежать обратных косых черт:

"\\[email protected]\\b"

Ответ 2

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

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

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

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


Update: Первый случай может быть разрешен отрицательным утверждением, но с использованием отрицательной границы слова \b, что приводит к более сильному синтаксису (@"\[email protected]\b").

Ответ 3

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

@"\bINSERT\b"

В противном случае регулярное выражение увидит "bINSERTb".