C ++ 11正则表达式捕获文件名,带有可选扩展名

时间:2014-07-14 10:12:57

标签: c++ regex c++11

我使用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)?$。 反正有没有避免这个?或者我应该手动修剪扩展名吗?

3 个答案:

答案 0 :(得分:2)

使用(.+?)。问号使得模式不贪婪。我想你还需要^

完整模式:"^/home/user/(.+?)(\\.png)?$"

您可能还想使用忽略大小写匹配。

答案 1 :(得分:0)

从索引1获取匹配的组。

这是DEMO

程序中使用的字符串文字:

C#

@"\/(\w+)\.png$"

答案 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)