我有一个正则表达式替换问题,我似乎无法弄清楚替换文件路径的一些配置参数。
这是我到目前为止所做的:
文件路径的正则表达式可能不完美,但似乎工作正常。
正则表达式:^(?<path>[^\\/*?<>|]+)\\\\(?<filename>.+)\\.(?<ext>.mp4$)
文件名匹配结果名称:$2
所以这样做是搜索扩展名为mp4的文件列表,并使用配置的匹配结果,将其作为“文件名”返回。
目标字符串示例,
\\\\folder\music\hello.mp4
result filename =“hello”
我想要做的是能够从正则表达式匹配中获取结果,并能够通过配置的设置替换文件/扩展名/路径的名称。
所以如果有人想要所有匹配的结果用“再见”替换文件名,我将如何实现这一目标。这就是我现在所拥有的。
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);
任何帮助都将不胜感激。
答案 0 :(得分:2)
查找和替换完全没必要,因为您已经拥有构建新路径所需的所有组件。
更换
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")
答案 1 :(得分:0)
您可能可以拆分组件以查看您拥有的内容:
^(.*?)\\?([^\\]+)\.([a-zA-Z0-9]+)$
修改或甚至更不具体的^(.*?)\\?([^\\]+)\.([^.]+)$
非验证
$ 1 =路径 $ 2 =文件名 $ 3 =延期
未捕获路径,文件名和扩展名之间的分隔符 有了这些信息,您可以构建自己的新字符串。
如果你想专门搜索说mp4这样的东西会起作用:
^(.*?)\\?([^\\]+)\.mp4$