gpt4 book ai didi

c++ - 如何捕获最多N次的重复组?

转载 作者:太空狗 更新时间:2023-10-29 21:33:04 25 4
gpt4 key购买 nike

我想捕获字符串中的数字链,但最多只能捕获 3 次。

之后的任何数字链都应该被忽略。例如:

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

我试过 (\d+){1,3} 但这似乎不起作用...

有什么提示吗?

最佳答案

您可以匹配并捕获前三个数字 block ,用任意数量的非数字和字符串的其余部分分隔,并替换为对这些组的反向引用:

^\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 .

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

关于c++ - 如何捕获最多N次的重复组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52851282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com