Как захватить повторную группу до N раз? - PullRequest
0 голосов
/ 17 октября 2018

Я хотел бы захватывать цепочки цифр в строке, но только до 3 раз.

Любая цепочка цифр после этого должна игнорироваться.Например:

T441_S45/1 => 441 45 1 007_S4 => 007 4 41_445T02_74 => 41 445 02

Я пытался (\d+){1,3}, но, похоже, это не сработало ...

Есть подсказка?

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете сопоставить и захватить первые три порции цифр, разделенных любым количеством нецифров и остальной частью строки, и заменить обратными ссылками на эти группы:

^\D*(\d+)(?:\D+(\d+))?(?:\D+(\d+))?.*

Или, еслистрока может быть многострочной,

^\D*(\d+)(?:\D+(\d+))?(?:\D+(\d+))?[\s\S]*

Заменяющая строка будет выглядеть как $1 $2 $3.

Подробности

  • ^- начало строки
  • \D* - 0+ нецифров
  • (\d+) - Группа 1: одна или несколько цифр
  • (?:\D+(\d+))? - необязательныйсопоставление групп захвата:
    • \D+ - 1+ нецифров
    • (\d+) - Группа 2: одна или несколько цифр
  • (?:\D+(\d+))? - другое необязательное сопоставление группы без захвата:

    • \D+ - одна или несколько нецифров
    • (\d+) - группа 3: одна или несколько цифр
  • [\s\S]* - остаток строки.

См. Демонстрационный пример regex .

C ++ demo :

#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::vector<std::string> strings;
    strings.push_back("T441_S45/1");
    strings.push_back("007_S4");
    strings.push_back("41_445T02_74");

    std::regex reg(R"(^\D*(\d+)(?:\D+(\d+))?(?:\D+(\d+))?[\s\S]*)");
    for (size_t k = 0; k < strings.size(); k++)
    {
        std::cout << "Input string: " << strings[k] << std::endl;
        std::cout << "Replace result: " 
                     << std::regex_replace(strings[k], reg, "$1 $2 $3") << std::endl;
    }
    return 0;
}

Вывод:

Input string: T441_S45/1
Replace result: 441 45 1
Input string: 007_S4
Replace result: 007 4 
Input string: 41_445T02_74
Replace result: 41 445 02
...