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 ;)
Update: Как отметил другой ответ, @
не является символом слова, поэтому между @
и пробелом нет границы слова. В качестве обходного пути можно использовать отрицательный lookbehind:
@"(?<!\w)@p1\b"
Оригинальный ответ: Вам нужен @
перед регулярными выражениями:
@"\b@p1\b"
Без этого строка "\b" интерпретируется как пробел (символ 8), а не как граница слова регулярного выражения. Более подробная информация о @-quoted string литералах есть на MSDN.
Альтернативный способ не использовать @-кавычки в строковых литералах - экранировать обратные слеши:
"\\b@p1\\b"
В ваших строках экранируется \
- вам нужно использовать строковые литералы, чтобы избежать этого:
@"\bINSERT\b"
Иначе regex увидит "bINSERTb"
.
Второй случай решается с помощью @ "\ bINSERT \ b"
, как указано в другом ответе.
Однако / b
соответствует адресу:
Словесный символ является одним из [a-zA-Z0-9 _]
, поэтому первый случай нельзя разрешить, добавив префикс @
, чтобы избежать \ b
], потому что вы пытаетесь сопоставить не словарный символ ( @
).
Обновление:
Первый случай может быть решен с помощью утверждения отрицательного ретроспективного просмотра, а также с помощью отрицательной границы слова \ B
, что приводит к более чистому синтаксису ( @ "\ B @ p1 \ b"
).