Ответ 1
+
является специальным символом, поэтому вам нужно его избежать
\bC\+\+(?!\w)
Обратите внимание, что мы не можем использовать \b
, потому что +
не является символом слова.
Я потратил некоторое время, но все же должен решить. Мне нужно регулярное выражение, которое может соответствовать словам со знаками в нем (например, С++) в строке.
Я использовал /\bword\b/
, для "обычных" слов он работает нормально. Но как только я попробую /\bC\+\+\b/
, это просто не работает. Некоторые из них работают неправильно с плюсами в нем.
Мне нужно регулярное выражение, чтобы определить, содержит ли строка ввода в нем слово С++. Вход как
"c++ developer"
"using c++ language"
и др.
пс. Использование функции С#.Net Regex.Match.
Спасибо за помощь!
+
является специальным символом, поэтому вам нужно его избежать
\bC\+\+(?!\w)
Обратите внимание, что мы не можем использовать \b
, потому что +
не является символом слова.
Проблема заключается не в символе плюса, который вы экранировали правильно, а в последовательности \b
. Он указывает границу слова, которая является точкой между символом слова (буквенно-цифровым) и чем-то другим. Плюс не является символом слова, поэтому для соответствия \b
должен существовать символ слова непосредственно после последнего знака плюса.
\bC\+\+\b
соответствует "Test С++ Test", но не "Test С++ Test", например. Попробуйте что-то вроде \bC\+\+\s
, если вы ожидаете, что после последнего знака плюса появится пробел.
Знак плюса имеет особое значение, поэтому вам придется избегать его с помощью \
. То же правило применяется к этим символам: \, *, +, ?, |, {, [, (,), ^, $,., #,
и пробел
ОБНОВЛЕНИЕ: проблема заключалась в последовательности \b
Как говорили другие, ваша проблема заключается не в знаке +
, который вы экранировали правильно, а в \b
, который представляет собой нулевую длину char, которая соответствует границе слова, которая имеет место между словом \w
и не-слово \w
char.
В вашем регулярном выражении есть еще одна ошибка: вы хотите сопоставить char C
(верхний регистр) с c++
(строчный). Для этого вам нужно изменить ваше регулярное выражение на /\bc\+\+/
или использовать i
для соответствия регистрозависимости: /\bc\+\+/i
Если вы хотите сопоставить c++
между символами non- слова (отличными от букв, цифр и подчеркиваний), вы можете использовать
\bc\+\+\B
Посмотрите демонстрацию regex, где \b
- это граница слова, а \B
соответствует всем позициям, которые не являются позициями границы слова.
Синтаксис С#:
var pattern = @"\bc\+\+\B";
Вы должны помнить, что \b
/\B
зависят от контекста: \b
совпадает между началом/концом строки и соседним словом char или между словом и символом non- слова, в то время как \B
совпадает между началом/концом строка и соседнее * non- * слово char или между двумя словами или двумя non- словом char.
Если вы строите шаблон динамически, трудно полагаться на шаблон границы слова \b
.
Вместо этого используйте обходные пути (?<!\w)
и (?!\w)
, они всегда будут соответствовать слову, которому не предшествует непосредственно/сопровождается словом char:
var pattern = [email protected]"(?<!w){Regex.Escape(word)}(?!\w)";
Если границы слов, которые вы хотите сопоставить, являются границами пробелов (то есть совпадение ожидается только между пробелами), используйте
var pattern = [email protected]"(?<!S){Regex.Escape(word)}(?!\S)";