使用VS12在C ++ 11中使用regex_match失败

时间:2014-03-13 23:29:43

标签: c++ regex c++11

我需要一个函数,如果字符串是C ++中的部分注释,则返回true(假设它只是以/ *作为条件开始),我认为一个简单的正则表达式应该快速解决我的解决方案。从刮擦中写出来,在http://regex101.com/在线测试,它就像一个魅力。但是在C ++中,使用c ++ 11 regex_match,它无法显示任何内容。我将正则表达式放在代码中:

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

编辑:我正在使用VS12作为我的编译器。

2 个答案:

答案 0 :(得分:2)

您需要转义字符串文字中的反斜杠。更好的解决方案是使用raw string literals来避免逃脱它们。

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

Live example

此外,你的正则表达式可以更简单,这也适用:

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

VS正则表达式实现中似乎存在一个错误,我能够重现你在VS2013上看到的行为。首先,你必须逃避反斜杠,如果你把警告级别提高到足够高,VS会警告你你发布的字符串文字中的非法转义序列。

假设已经完成,你的代码仍然找不到匹配,看起来VS不喜欢的部分是:[\\S\\s]*。如果用.*替换该部分,则代码可以正常工作。以下所有3个版本都将打印OK

regex partialCommReg("(^[\\/][\\*].*$)");
regex partialCommReg("(^/\\*.*$)");      // simplified version of the one above
regex partialCommReg(R"((^/\*.*$))");    // uses raw string literals, VS2013 only

答案 1 :(得分:1)

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

注意转义序列。此外,如果您使用的是g ++,则在4.9之前不支持它(正则表达式)。在此之前,它只会在您尝试执行任何操作时抛出异常(但它会编译)。