我有以下格式的字符串:7XXXX 8YYYY 9ZZZZ 0LLLL 7XXXX 8YYYY 9ZZZZ 0LLLL
,
7XXXX 8YYYY 9ZZZZ 0LLLL
组可以重复任意次; 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/