我正在尝试使用正则表达式从字符串中提取版本号。版本号的格式为“ 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”)中。
我希望只能提取第一个比赛。有没有办法使用正则表达式来做到这一点?
答案 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