gpt4 book ai didi

c++ - 使用 Boost::regex 进行正则表达式组匹配

转载 作者:行者123 更新时间:2023-11-30 03:58:08 25 4
gpt4 key购买 nike

我有格式字符串:

7XXXX 8YYYY 9ZZZZ 0LLLL 7XXXX 8YYYY 9ZZZZ 0LLLL,

  • 其中 7XXXX 8YYYY 9ZZZZ 0LLLL 组可以重复任意次数;
  • X、Y、Z、L为数字;
  • 从 7、8、9、0 开始的组依次进行
  • 可能缺少组,例如 7XXXX 0LLLL 8YYYY 0LLLL 7XXXX 8YYYY 9ZZZZ 0LLLL

我正在尝试使用 Boost::regex 库来实现我的目标。

我想拆分这些组并将它们放入一个数组或 vector 中。现在我正在尝试 cout 它们。

我正在尝试这样做,但我只能在 7、8、9、0 组中的每一个中获得完整的字符串匹配或最后一个匹配,但不能像这些 7XXXX 8YYYY 9ZZZZ 0LLLL 这样的字符串

 const char* pat = "(([[:space:]]+7[0-9]{4}){0,1}([[:space:]]+8[0-9]{4}){0,1}([[:space:]]+9[0-9]{4}){0,1}([[:space:]]+0[0-9]{4}){0,1})+";;
boost::regex reg(pat);
boost::smatch match;
string example= "71122 85451 75415 01102 75555 82133 91341 02134";

const int subgroups[] = {0,1,2,3,4,5,6};
boost::sregex_token_iterator i(example.begin(), example.end(), reg, subgroups);
boost::sregex_token_iterator j;

while (i != j)
{
cout << "Match: " << *i++ << endl;
}

示例输出:

Match: 71122 85451 75415 01102 75555 82133 91341 02134
<A bunch of empty "Match:" rows>
Match: 75555
Match: 82133
Match: 91341
Match: 02134
<A bunch of empty "Match:" rows>

但我想这样得到它:

71122 85451 
75415 01102
75555 82133 91341 02134

我知道我做错了,无法使用正则表达式来做我想做的事情:( 为什么我不能使用括号获得所有递归匹配?

最佳答案

编辑:由于我第一次完全误解了,所以我将替换整个答案。我的思路是这样的:

const char* pat = "[[:space:]]+((7[0-9]{4})?([[:space:]]+8[0-9]{4})?([[:space:]]+9[0-9]{4})?([[:space:]]+0[0-9]{4})?)";
boost::regex reg(pat);
boost::smatch match;

// v-- extra space here to make the match easier.
std::string example= " 71122 85451 75415 01102 75555 82133 91341 02134";

boost::sregex_token_iterator i(example.begin(), example.end(), reg, 1);
boost::sregex_token_iterator j;

while (i != j)
{
std::cout << "Match: " << *i++ << std::endl;
}

如果无法修改字符串,解决空匹配问题的方法是

const char* pat = "((7[0-9]{4})?([[:space:]]+8[0-9]{4})?([[:space:]]+9[0-9]{4})?([[:space:]]+0[0-9]{4})?)";
boost::regex reg(pat);
boost::smatch match;
std::string example= "71122 85451 75415 01102 75555 82133 91341 02134";

boost::sregex_token_iterator i(example.begin(), example.end(), reg, 1);
boost::sregex_token_iterator j;

while (i != j)
{
if(i->length() != 0) {
std::cout << "Match: " << *i << std::endl;
}

++i;
}

尽管在那种情况下使用 regex_iterator 代替 regex_token_iterator 可以说会更好:

// No need for outer spaces anymore
const char* pat = "(7[0-9]{4})?([[:space:]]+8[0-9]{4})?([[:space:]]+9[0-9]{4})?([[:space:]]+0[0-9]{4})?";

boost::sregex_iterator i(example.begin(), example.end(), reg);
boost::sregex_iterator j;

// Rest the same.

关于c++ - 使用 Boost::regex 进行正则表达式组匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27599186/

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