gpt4 book ai didi

c++ - 当不存在可选子字符串时,避免匹配中的空元素

转载 作者:行者123 更新时间:2023-11-28 04:18:52 24 4
gpt4 key购买 nike

我正在尝试创建一个匹配 diff 终端命令返回的字符串的正则表达式。

这些字符串以十进制数字开头,可能有一个由逗号和数字组成的子字符串,然后是一个强制性字符(acd ) 另一个强制性十进制数后跟另一个可选组。

例子:

27a27
27a27,30
28c28
28,30c29,31
1d1
1,10d1

我正在尝试分别提取所有组,但不包括没有 , 的可选组。

我在 C++ 中这样做:

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

int main(int argc, char* argv[])
{

string t = "47a46";
std::string result;
std::regex re2("(\\d+)(?:,(\\d+))?([acd])(\\d+)(?:,(\\d+))?");
std::smatch match;
std::regex_search(t, match, re2);
cout<<match.size()<<endl;
cout<<match.str(0)<<endl;

if (std::regex_search(t, match, re2))
{
for (int i=1; i<match.size(); i++)
{
result = match.str(i);
cout<<i<<":"<<result<< " ";
}
cout<<endl;
}

return 0;
}

字符串变量t就是我要操作的字符串。我的正则表达式

(\\d+)(?:,(\\d+))?([acd])(\\d+)(?:,(\\d+))?

有效,但对于没有可选子组的字符串(例如 47a46),match 变量将在预期子字符串的相应位置包含空元素。

例如在上面的程序中,match 的元素(前面有它们的索引)是:

1:47 2: 3:a 4:46 5: 

位置 25 中的元素对应于在这种情况下不存在的可选子字符串,因此我希望 match 避免检索它们将是:

1:47 2:a 3:46 

我该怎么做?

最佳答案

我认为最适合您的 RE 是这样的:

std::regex re2(R"((\d+)(?:,\d+)?([a-z])(\d+)(?:,\d+)?)");

- 这样它应该匹配所有必需的组(但可选)

输出:

4
47a46
1:47 2:a 3:46

注意:re2 的参数字符串以 c++11 表示法给出。

编辑:稍微简化了 RE

关于c++ - 当不存在可选子字符串时,避免匹配中的空元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918671/

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