Ошибка regex_match в C ++ 11 с использованием VS12

0

Мне нужна функция, которая возвращает true, если строка является частичным комментарием в C++ (скажем, она начинается с /* как условие), и я подумал, что простое регулярное выражение должно быстро решить мое решение. Написал его от царапин, протестировал его в Интернете по адресу http://regex101.com/, и он работал как шарм. Но в C++, используя C++ 11 regex_match, он ничего не отображает. Я поместил регулярное выражение в код:

regex partialCommReg("(^[\/][\*][\S\s]*$)");
if (regex_match ("/* ", partialCommReg) )
  cout<<"ok";

edit: Я использую VS12 в качестве моего компилятора.

  • 2
    Расскажите нам, какой компилятор вы тоже используете.
Теги:
c++11

2 ответа

2

Вам нужно избежать обратных косых черт в строковом литерале. Лучшее решение - использовать исходные строковые литералы, чтобы избежать их избежать.

regex partialCommReg(R"((^[\/][\*][\S\s]*$))");
//                   ^ ^                   ^ 

Живой пример

Кроме того, ваше регулярное выражение может быть сделано немного проще, это тоже работает:

regex partialCommReg(R"((^/\*[\S\s]*$))");

Кажется, что ошибка в реализации регулярного выражения VS, я смог воспроизвести поведение, которое вы видите на VS2013. Во-первых, вам нужно избегать обратных косых черт, и если вы повысите уровень предупреждения до достаточно высокого значения, VS предупредит вас о незаконных escape-последовательностях в строковом литерале, который вы опубликовали.

Предполагая, что это сделано, ваш код все равно не найдет совпадения, и похоже, что часть VS не нравится: [\\S\\s]*. Если вы замените эту часть на .*, Код работает. Все 3 версии ниже напечатают OK.

regex partialCommReg("(^[\\/][\\*].*$)");
regex partialCommReg("(^/\\*.*$)");      // simplified version of the one above
regex partialCommReg(R"((^/\*.*$))");    // uses raw string literals, VS2013 only
  • 0
    13 IntelliSense: идентификатор «R» не определен Source.cpp 54 22 Project1
  • 0
    @Radu Хм, похоже, что строковые литералы были добавлены в VS2013. Извините, вам придется избежать обратной косой черты, как показано в другом ответе, или обновить VS.
Показать ещё 4 комментария
1
regex partialCommReg("(^[\\/][\\*][\\S\\s]*$)");

Обратите внимание на escape-последовательности. Кроме того, если вы используете g++, он (regex) не поддерживается до 4.9. До этого он просто генерирует исключение, когда вы пытаетесь сделать что-либо (но оно будет скомпилировано).

  • 0
    все еще не работает. Я использую Visual Studio 2012 C ++. Кроме того, тестирование на regex101.com не проходит.
  • 2
    @RaduVlad: вы не учитываете слой строкового литерала C ++. Это имеет свой собственный выход, помимо того, что используется в регулярном выражении. Вы не можете просто извлечь символьный строковый литерал C ++, вставить его в regex101.com и ожидать, что он будет работать.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню