Я хотел бы захватить цепочки цифр в строку, но только до 3 раз.
Любая цепочка цифр после этого должна игнорироваться. Например:
T441_S45/1 => 441 45 1
007_S4 => 007 4
41_445T02_74 => 41 445 02
я пробовал (\d+){1,3}
но это не похоже на работу …
Любой намек?
Вы можете сопоставить и захватить первые три порции цифр, разделенных любым количеством нецифров и остальной частью строки, и заменить обратными ссылками на эти группы:
^\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 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
Других решений пока нет …