【问题标题】:regex visual studio正则表达式视觉工作室
【发布时间】:2016-04-26 00:11:55
【问题描述】:

我打算使用以下正则表达式来捕获文件的路径和名称:

std::regex capture_path_name_file("(.+)\\([^\\]+)\\.[^\\]+$");

但是在运行时(我正在使用 Visual Studio)我得到了正则表达式错误

error_brack: the expression contained mismatched [ and ]

试图查明原因,我尝试了以下正则表达式:

std::regex test("[^\\]")

我也遇到了同样的错误。

我已经在regex101.com 中测试了我的正则表达式(略有不同,我必须使用\. 而不是\\.

感谢您的帮助。

【问题讨论】:

  • 在 C++ 语法中,"[^\\]" 表示 [^\],在正则表达式中是不匹配的 [。如果您要创建一个“非反斜杠”字符类,则必须为 C++ 转义一次,为正则表达式转义一次,即[^\\\\]
  • 它适用于 php,但也应该回答您的问题:stackoverflow.com/a/14783396/4181011
  • this demo

标签: c++ regex c++11 visual-c++ visual-studio-2013


【解决方案1】:

您遇到的问题是因为 \\ 在常规字符串文字中被视为 1 个文字 \ 符号。 Biffenhis comment 中解释得很好,[^\\] 被视为 [^\]] 被视为文字 ] 而不是结束字符类分隔符(并且没有匹配的 ] 到进一步关闭字符类)。

正确答案是:使用_splitpath_s

如果你想进一步使用正则表达式,你可以这样修复它:

#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::regex rex1(R"((.+?)([^\\.]+\.[^\\.]+)$)");
    std::smatch m;
    std::string str = "c:\\Python27\\REGEX\\test_regex.py";
    if (regex_search(str, m, rex1)) {
        std::cout << "Path: " << m[1] << std::endl;
        std::cout << "File name: " << m[2] << std::endl;
    }
    return 0;
}

使用原始字符串文字,您可以避免大多数与转义相关的问题。使用R"((.+?)([^\\.]+\.[^\\.]+)$)",它会将文件夹路径匹配并捕获到第1组,并将带有扩展名的文件名捕获到第2组。请注意,扩展名必须存在。

【讨论】:

  • 我强烈认为_splitpath_s 不是 一个好的解决方案,而是遍历std::tr2::path 的实例(VC++ 2015 中的std::experimental::path)。
猜你喜欢
  • 2013-04-19
  • 2011-02-02
  • 2014-05-30
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多