Регулярное выражение для соответствия слова со знаками + (плюс) - PullRequest
10 голосов
/ 04 сентября 2010

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

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

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

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

и т.д.

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

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

Ответы [ 5 ]

16 голосов
/ 04 сентября 2010

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

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

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

5 голосов
/ 04 сентября 2010

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

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

2 голосов
/ 04 сентября 2010

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

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

0 голосов
/ 25 января 2019

Если вы хотите сопоставить c++ между несловарными символами (символами, отличными от букв, цифр и подчеркиваний), вы можете использовать

\bc\+\+\B

См. Демонстрационный пример regex , где\b - это граница слова , а \B соответствует всем позициям, не являющимся позициями границы слова.

Синтаксис C #:

var pattern = @"\bc\+\+\B";

Вы должны помнить, что \b / \B зависят от контекста: \b соответствует между началом / концом строки и соседним словом char или между словом и несловесным символом, в то время как \B соответствует между началом / концом строки исмежный * не- * слово char или между двумя словами или двумя неслововыми символами.

Если вы строите шаблон динамически, трудно полагаться на границу слова \b pattern.

Используйте вместо этого (?<!\w) и (?!\w) lookarounds, они всегда будут соответствовать слову, которому не предшествует непосредственно / сопровождается словом char:

var pattern = $@"(?<!w){Regex.Escape(word)}(?!\w)";

Если вы хотите ограничить границы словасовпадение - это пробельные границы (то есть совпадение ожидаетсятолько между пробелами), используйте

var pattern = $@"(?<!S){Regex.Escape(word)}(?!\S)";
0 голосов
/ 04 сентября 2010

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

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

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