Мне нужна функция, которая возвращает true, если строка является частичным комментарием в C++ (скажем, она начинается с /* как условие), и я подумал, что простое регулярное выражение должно быстро решить мое решение. Написал его от царапин, протестировал его в Интернете по адресу http://regex101.com/, и он работал как шарм. Но в C++, используя C++ 11 regex_match, он ничего не отображает. Я поместил регулярное выражение в код:
regex partialCommReg("(^[\/][\*][\S\s]*$)");
if (regex_match ("/* ", partialCommReg) )
cout<<"ok";
edit: Я использую VS12 в качестве моего компилятора.
Вам нужно избежать обратных косых черт в строковом литерале. Лучшее решение - использовать исходные строковые литералы, чтобы избежать их избежать.
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
regex partialCommReg("(^[\\/][\\*][\\S\\s]*$)");
Обратите внимание на escape-последовательности. Кроме того, если вы используете g++, он (regex) не поддерживается до 4.9. До этого он просто генерирует исключение, когда вы пытаетесь сделать что-либо (но оно будет скомпилировано).