Вернуть первый матч только с regex_search - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь извлечь номер версии из строки с помощью регулярного выражения. Номер версии имеет формат «DDDc», где «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 Ответ

3 голосов
/ 01 октября 2019

Спасибо @TheFourthBird за ответ.

Я изменил свое регулярное выражение, добавив в конец отрицательную заглядывание, чтобы поиск останавливался на первом соответствующем экземпляре.

\s(\d+)\.(\d+)\.(\d+)([a-zA-Z])?\s(?!\d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...