【问题标题】:search/replace boost regex C++搜索/替换 boost 正则表达式 C++
【发布时间】:2011-08-11 19:18:54
【问题描述】:

我遇到了一个正则表达式替换问题,我似乎无法解决替换文件路径的某些配置参数的问题。

这是我目前所拥有的:

文件路径的正则表达式可能并不完美,但似乎可以正常工作。

正则表达式:^(?<path>[^\\/*?<>|]+)\\\\(?<filename>.+)\\.(?<ext>.mp4$)

文件名匹配结果名称:$2

所以这是在搜索扩展名为 mp4 的文件列表,并使用配置的匹配结果,它将作为“文件名”返回。

目标字符串示例,

\\\\folder\music\hello.mp4

结果文件名 = "你好"

我想做的是能够从正则表达式匹配中获取结果,并能够用配置的设置替换文件/扩展名/路径的名称。

因此,如果有人希望所有匹配的结果都用“再见”替换文件名,我将如何做到这一点。这就是我现在所拥有的。

std::string sz_regex_pattern("^(?<path>[^\/*?<>|]+)\\(?<filename>.+)\.(?<ext>.mp4$)");
boost::cmatch rm;
boost::regex pattern(sz_regex_pattern, regex::icase|regex_constants::perl);
std::string complete_file_name_path = "\\folder\music\hello.mp4";
bool result = boost::regex_match(complete_file_name_path , rm, pattern);
std::string old_filename= rm.format("$2"); // returns the name of the file only

似乎可行,但将其限制为文件夹名称不同的文件名,因此, \\folder\music\hello\hello.mp4 下面的 regex_replace 会有问题。

std::string new_filename = "goodbye";

std::string sz_new_file_name_path = boost::regex_replace(complete_file_name_path, old_filename, new_filename);

这样我以后可以,

boost::filesystem::rename(complete_file_name_path, sz_new_file_name_path);

任何帮助将不胜感激。

【问题讨论】:

    标签: c++ regex boost replace


    【解决方案1】:

    完全不需要查找和替换,因为您已经拥有构建新路径所需的所有组件。

    替换

    std::string sz_new_file_name_path = boost::regex_replace(complete_file_name_path, old_filename, new_filename);
    

    // path + newFileName + ext
    std::string sz_new_file_name_path = rm.format("$1") + "\\" + new_filename + "." + rm.format("$3")
    

    【讨论】:

    • 我想了很多,没有必要替换。
    【解决方案2】:

    您可能可以拆分组件以查看您拥有的内容:

    ^(.*?)\\?([^\\]+)\.([a-zA-Z0-9]+)$
    edit 甚至更不具体的^(.*?)\\?([^\\]+)\.([^.]+)$ 非验证

    $1 = 路径 $2 = 文件名 $3 = 扩展

    不捕获路径、文件名和扩展名之间的分隔符。
    有了这些信息,您可以构建自己的新字符串。

    如果你想专门搜索 mp4,这样的东西会起作用:

    ^(.*?)\\?([^\\]+)\.mp4$

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-25
      • 2011-07-09
      • 2010-11-25
      相关资源
      最近更新 更多