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

regex_match failure in C++11 using VS12

本文关键字:match 失败 regex 中的 VS12 C++11 使用      更新时间:2023-10-16

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

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

edit:我使用VS12作为我的编译器。

您需要对字符串文字中的反斜杠进行转义。更好的解决方案是使用原始字符串文字,以避免对其进行转义。

regex partialCommReg(R"((^[/][*][Ss]*$))");
//                   ^ ^                   ^ 

实例

此外,您的正则表达式可以简单一点,这也很有效:

regex partialCommReg(R"((^/*[Ss]*$))");

VS regex实现中似乎有一个错误,我能够重现您在VS2013上看到的行为。首先,您必须对反斜杠进行转义,如果您将警告级别提高到足够高,VS将警告您发布的字符串文字中存在非法转义序列。

假设完成了,您的代码仍然找不到匹配项,而且VS不喜欢的部分看起来是这样的:[\S\s]*。如果将该部分替换为.*,则代码有效。以下三个版本都将打印OK

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

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