如何捕获最多N次的重复组?
How to capture repeated group up to N times?
我想捕获字符串中的数字链,但最多只能捕获 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]*
替换字符串看起来像
。
详情
^
- 字符串开头
\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, " ") << 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
我想捕获字符串中的数字链,但最多只能捕获 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]*
替换字符串看起来像
。
详情
^
- 字符串开头\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, " ") << 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