Регулярное совпадение цифр между строками - PullRequest
0 голосов
/ 24 июня 2018

Мне нужно извлечь целочисленные значения из следующего текста, между строками "start:" и "end:", и только между.

 111222 garbage  999888 start:        123456       end:     start:         654321     end:

желаемых результатов:

123456
654321

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

станд :: регулярное выражение

(?<=start:)(.*?)(?=end:)

RegExr

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Мне нужно извлечь целочисленные значения из следующего текста, между строками "start:" и "end:", и только * между.
111222 garbage 999888 start: 123456 end: start: 654321 end:

Вы можете использовать это: start:\s*([0-9]+)

int main()
{
    std::string str{R"(111222 garbage  999888 start:        123456       end:     start:         654321     end:)"};
    std::regex rgx{R"(start:\s*([0-9]+))"};
    std::smatch matches;

    while (std::regex_search(str, matches, rgx)) {
        std::cout << matches.str(1) << std::endl;
        str = matches.suffix();
    }
}

Выходы:

123456
654321

Демо

0 голосов
/ 24 июня 2018

Вы можете использовать

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+ символам, кроме символов перевода строки).

0 голосов
/ 24 июня 2018

Чтобы извлечь целочисленные значения между start: и end: без просмотра, вы можете захватить одну или несколько цифр в группе захвата:

  • Совпадение start:, за которым следуют ноль или более пробельных символов \s*
  • (/d+) Захват одной или нескольких цифр в группе
  • (?=\s*end:) положительный lookahead , который утверждает, что ниже следует ноль или более пробельных символов и end:

start:\s*(\d+)(?=\s*end:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...