Вы можете использовать
std::regex reg(R"(start:\s*(\d+)\s*end:)");
См. Демоверсию regex .
Он определяет шаблон регулярного выражения start:\s*(\d+)\s*end:
, который соответствует пробелам start:
, 0+, затем захватывает в группу 1 одну или несколько цифр, а затем сопоставляет пробелы 0+ и подстроку end:
.
Обратите внимание, что если вы не можете использовать необработанные строковые литералы (нотация R"(...)"
), вы можете определить шаблон с обычным строковым литералом, в котором все обратные косые черты должны быть удвоены: "start:\\s*(\\d+)\\s*end:"
.
Чтобы получить все совпадения, вам нужно std::sregex_token_iterator
, и при получении совпадений укажите, что вам нужно захватить все значения группы 1:
const std::regex reg(R"(start:\s*(\d+)\s*end:)");
std::smatch match;
std::string s = "garbage 111222 garbage ... 999888 fewfew... start: 123456 end: start: 654321 end:";
std::vector<std::string> results(std::sregex_token_iterator(s.begin(), s.end(), reg, 1),
std::sregex_token_iterator());
См. онлайн C ++ демо
Если в start:
и end:
может быть какое-либо значение, замените \d+
на .*?
(соответствует любым 0+ символам, кроме символов перевода строки).