使用VS12的C++11中的regex_match失败
regex_match failure in C++11 using VS12
如果字符串是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(。在此之前,它只是在您尝试执行任何操作时抛出一个异常(但它会编译(。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么打印对象失败并显示"no match for 'operator<<'"错误?
- 为什么第二次初始化工作,而第一次初始化由于"element type does not match"而失败?