Очень простое регулярное выражение не работает
У меня читать, чтобы соответствовать слову внутри строки, используя регулярные выражения (в .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"
.