我使用g++ 4.9.0
,因此它支持正则表达式:)我尝试使用可选扩展名提取文件名:
#include <regex>
smatch match_result;
regex pattern("/home/user/(.+)(\\.png)?$");
if (!regex_search("/home/user/image.png", match_result, pattern) {
throw runtime_error("Path does not match the pattern.");
}
cout << "File name: " << match_result[1] << '\n';
运行此代码段,在我期待image.png
时输出image
。显然+
量词是贪婪的,忽略了以下模式(\\.png)?$
。
反正有没有避免这个?或者我应该手动修剪扩展名吗?
答案 0 :(得分:2)
使用(.+?)
。问号使得模式不贪婪。我想你还需要^
。
完整模式:"^/home/user/(.+?)(\\.png)?$"
。
您可能还想使用忽略大小写匹配。
答案 1 :(得分:0)
答案 2 :(得分:0)
您的代码示例不使用regex pattern("/home/user/(.+)(\\.png)?$")
。它使用您在调用regex_search()时创建的新正则表达式:
regex_search("/home/user/image.png", match_result, regex("/home/user/(.+)"))
您实际使用的正则表达式不会检查.png
扩展名。
试试这个:
regex_search("/home/user/image.png", match_result, pattern)