Очень простое регулярное выражение не работает - PullRequest
6 голосов
/ 30 марта 2010

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

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");

Есть что-то, что я делаю не так?

РЕДАКТИРОВАТЬ: Второй уже работает;)

Ответы [ 3 ]

10 голосов
/ 30 марта 2010

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

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

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

@"\b@p1\b"

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

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

"\\b@p1\\b"
4 голосов
/ 30 марта 2010

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

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

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

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


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

1 голос
/ 30 марта 2010

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

@"\bINSERT\b"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...