使用Boost-Regex将字符串解析为字符和数字

时间:2011-05-24 16:47:04

标签: c++ boost boost-regex

我想使用Boost的Regex库将包含标签和数字的字符串分隔为标记。例如,'abc1def002g30'将分为{'abc','1','def','002','g','30'}。我修改了Boost文档中给出的example来提出这段代码:

#include <iostream>
#include <boost/regex.hpp>

using namespace std;

int main(int argc,char **argv){
    string s,str;
    int count;
    do{
        count=0;
        if(argc == 1)
        {
            cout << "Enter text to split (or \"quit\" to exit): ";
            getline(cin, s);
            if(s == "quit") break;
        }
        else
            s = "This is a string of tokens";

        boost::regex re("[0-9]+|[a-z]+");
        boost::sregex_token_iterator i(s.begin(), s.end(), re, 0);
        boost::sregex_token_iterator j;
        while(i != j)
        {
            str=*i;
            cout << str << endl;
            count++;
            i++;
        }
        cout << "There were " << count << " tokens found." << endl;

    }while(argc == 1);
    return 0;
}

count中存储的令牌数是正确的。但是,*it只包含一个空字符串,因此不打印任何内容。有什么猜测我做错了什么?

编辑:根据下面建议的修复,我修改了代码,现在它可以正常工作。

1 个答案:

答案 0 :(得分:2)

来自sregex_token_iterator上的文档:

效果:构造一个regex_token_iterator,它将使用匹配标志m(参见match_flag_type)为序列[a,b]中找到的表达式re的每个正则表达式匹配枚举一个字符串。枚举的字符串是找到的每个匹配的子表达式子匹配; 如果submatch为-1,则枚举所有与表达式 re不匹配的文本序列(即执行字段拆分)

由于你的正则表达式匹配所有项目(不像示例代码,只匹配字符串),你得到空的结果。

尝试将其替换为0。