仅使用regex_search返回第一个匹配项

时间:2019-10-01 13:58:31

标签: c++ regex c++11

我正在尝试使用正则表达式从字符串中提取版本号。版本号的格式为“ D.D.Dc”,其中“ D”是数字(可以是一个或多个实例),“ c”是一个可选的字母字符,两边都用空格包围。

我要从中提取它的字符串是这样的:

FOO 5.1.7d BAR 5.0.2 2019/06/18

我使用的正则表达式是:

\s(\d+)\.(\d+)\.(\d+)([a-zA-Z])?\s

下面是我正在使用的代码。

static regex FWVersionFormat{ R"(\s(\d+)\.(\d+)\.(\d+)([a-zA-Z])?\s)" }; 

auto matches = cmatch{};
if (regex_search(strVersion.c_str(), matches, FWVersionFormat))
{
    int maj = 0, min = 0, maint = 0, build = 0;
    if (!matches[1].str().empty()) maj = strtol(matches[1].str().c_str(), nullptr, 10);
    if (!matches[2].str().empty()) min = strtol(matches[2].str().c_str(), nullptr, 10);
    if (!matches[3].str().empty()) maint = strtol(matches[3].str().c_str(), nullptr, 10);
    if (!matches[4].str().empty()) build = matches[4].str().c_str()[0] - ('a' - 1);
    return{ maj, min, maint, build };
}

如果版本字符串中只有一个匹配项,则可以正常工作,但问题是regex_search()将版本的第二个实例放入匹配项(“ 5.0.2”)中。

我希望只能提取第一个比赛。有没有办法使用正则表达式来做到这一点?

1 个答案:

答案 0 :(得分:3)

感谢@TheFourthBird的回答。

我将正则表达式更改为在末尾包含否定的前瞻,因此搜索在第一个匹配的实例处停止。

sbt:example> run
[info] Running example.Main 
env example.Main$$anon$1@45bfc0da queue zio.Queue$$anon$1@13b73d56
env example.Main$$anon$1@45bfc0da queue zio.Queue$$anon$1@13b73d56
Give me Coffee!
[success] Total time: 1 s, completed Oct 1, 2019 7:41:47 AM