Использование регулярных выражений в VC ++ - PullRequest
1 голос
/ 25 февраля 2010

Я нахожу идентификаторы электронной почты в проекте mu, где я предварительно обрабатываю ввод с использованием некоторого регулярного выражения.

RegExpPhone6.RegComp("[\[\{\(][ -]?[s][h][i][f][t][ -]?[+-][2][ -]?[\]\}\)]");  

Здесь, во время компиляции, я получаю сообщение с предупреждением типа

Warning 39  warning C4129: ')' : unrecognized character escape sequence 

Как мне решить эту проблему?Почему это происходит и где это повлияет?Пожалуйста, помогите мне ...

Ответы [ 4 ]

2 голосов
/ 20 апреля 2012

Компилятор C ++ преобразует определенные escape-последовательности в строковых литералах в альтернативные значения. Наиболее известным из них является, вероятно, \ n, который преобразуется в символ перевода строки. В этом случае компилятор жалуется, потому что \) не является одним из стандартного набора escape-последовательностей (список которых можно найти здесь , среди других мест). Поскольку вы хотите, чтобы само регулярное выражение содержало обратную косую черту, вы, вероятно, хотите использовать \\, которая является escape-последовательностью, которая преобразуется в один \. Примерно так:

RegExpPhone6.RegComp("[\\[\\{\\(][ -]?[s][h][i][f][t][ -]?[+-][2][ -]?[\\]\\}\\)]");
2 голосов
/ 25 февраля 2010

Я не уверен, с каким типом регулярных выражений вы используете, но, согласно ошибке,

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

В большинстве случаев () и {} внутри [] не нужно было бы убегать, просто [(){}] было бы хорошо.

и [s][h][i][f][t] будут такими же, как shift

Итак, это будет так

RegExpPhone6.RegComp("[\[{(][ -]?shift[ -]?[+-][2][ -]?[\]})]");    

А

Если это по-прежнему не работает, попробуйте изменить \ на \\, иногда необходимо избежать обратной косой черты.

1 голос
/ 28 марта 2010

В вашем классе персонажей есть экранированные символы, которые не должны (и не должны) экранироваться, особенно (), [] и {}.

В вашем случае

RegExpPhone6.RegComp("[{([][ -]?shift[ -]?[+-][2][ -]?[]})]");

должно быть хорошо.

Обратите внимание, что порядок символов внутри класса символов имеет значение для этой работы.

[][(){}] будет соответствовать всем скобкам / скобкам / скобкам. Но это может отбросить людей («это пустой класс символов?»), Так что в этом случае лучше было бы выйти за скобки:

RegExpPhone6.RegComp("[{(\[][ -]?shift[ -]?[+-][2][ -]?[\]})]");

См. Также Блог Яна Гойваэрта о том, почему и где это может быть проблемой.

0 голосов
/ 25 февраля 2010

Вы уверены, что не использовали двойные кавычки в строке?

Решить проблему с помощью бинарного поиска. Избавьтесь от половины символов и посмотрите, скомпилируется ли она. Если он компилируется, повторите с другой половиной. Затем повторите, используя половину некомпилируемой строки, пока не найдете символ, вызывающий проблему. Затем избегайте его, используя обратную косую черту.

например. если вы хотите использовать двойные кавычки в строке, вы должны написать это:

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