首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex视听演播室

regex视听演播室
EN

Stack Overflow用户
提问于 2016-01-20 08:38:04
回答 1查看 2K关注 0票数 2

我计划使用以下regex捕获文件的路径和名称:

代码语言:javascript
复制
std::regex capture_path_name_file("(.+)\\([^\\]+)\\.[^\\]+$");

但是当运行时(我使用的是visual studio),我会得到regex错误

代码语言:javascript
复制
error_brack: the expression contained mismatched [ and ]

为了找出原因,我尝试了以下正则表达式:

代码语言:javascript
复制
std::regex test("[^\\]")

我也犯了同样的错误。

我已经在regex101.com中测试了我的正则表达式(我不得不使用\.而不是\\.)。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-20 09:03:43

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

正确的答案是:使用_splitpath_s

如果您想进一步使用regex,可以这样修复它:

代码语言:javascript
复制
#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组。请注意,扩展必须存在。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34895119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档