Регулярное выражение соответствует знаку + (плюс)

Я потратил некоторое время, но все же должен решить. Мне нужно регулярное выражение, которое может соответствовать словам со знаками в нем (например, С++) в строке.

Я использовал /\bword\b/, для "обычных" слов он работает нормально. Но как только я попробую /\bC\+\+\b/, это просто не работает. Некоторые из них работают неправильно с плюсами в нем.

Мне нужно регулярное выражение, чтобы определить, содержит ли строка ввода в нем слово С++. Вход как

"c++ developer"
"using c++ language" 

и др.

пс. Использование функции С#.Net Regex.Match.

Спасибо за помощь!

Ответ 1

+ является специальным символом, поэтому вам нужно его избежать

\bC\+\+(?!\w)

Обратите внимание, что мы не можем использовать \b, потому что + не является символом слова.

Ответ 2

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

\bC\+\+\b соответствует "Test С++ Test", но не "Test С++ Test", например. Попробуйте что-то вроде \bC\+\+\s, если вы ожидаете, что после последнего знака плюса появится пробел.

Ответ 3

Знак плюса имеет особое значение, поэтому вам придется избегать его с помощью \. То же правило применяется к этим символам: \, *, +, ?, |, {, [, (,), ^, $,., #, и пробел

ОБНОВЛЕНИЕ: проблема заключалась в последовательности \b

Ответ 4

Как говорили другие, ваша проблема заключается не в знаке +, который вы экранировали правильно, а в \b, который представляет собой нулевую длину char, которая соответствует границе слова, которая имеет место между словом \w и не-слово \w char.

В вашем регулярном выражении есть еще одна ошибка: вы хотите сопоставить char C (верхний регистр) с c++ (строчный). Для этого вам нужно изменить ваше регулярное выражение на /\bc\+\+/ или использовать i для соответствия регистрозависимости: /\bc\+\+/i

Ответ 5

Если вы хотите сопоставить 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)";