如何检查用于匹配的匹配组(boost-regex)

时间:2012-11-28 19:24:45

标签: c++ regex parsing c++11 boost-regex

我正在使用boost :: regex来解析一些格式化字符串,其中'%'符号是转义字符。因为我没有很多使用boost :: regex的经验,而且说实话正是我做了一些试验和错误。这段代码是我提出的某种原型。

std::string regex_string = 
            "(?:%d\\{(.*)\\})|"                   //this group will catch string for formatting time
            "(?:%([hHmMsSqQtTlLcCxXmMnNpP]))|"    //symbols that have some meaning
            "(?:\\{(.*?)\\})|"                    //some other groups
            "(?:%(.*?)\\s)|"
            "(?:([^%]*))";

    boost::regex regex;
    boost::smatch match;

    try
    {
        regex.assign(regex_string, boost::regex_constants::icase);
        boost::sregex_iterator res(pattern.begin(), pattern.end(), regex);
        //pattern in line above is string which I'm parsing
        boost::sregex_iterator end;
        for(; res != end; ++res)
        {
            match = *res;
            output << match.get_last_closed_paren();
            //I want to know if the thing that was just written to output is from group describing time string
            output << "\n";
        }


    }
    catch(boost::regex_error &e)
    {
        output<<"regex error\n";
    }

这个效果非常好,在输出上我确切地想要捕获。但我不知道它是从哪个群体。我可以做match[index_of_time_group]!=""这样的事情,但这有点脆弱,看起来不太好。如果我更改regex_string指向群组捕获字符串的索引格式化时间也可能会更改。

有一种巧妙的方法吗?像命名组一样?我会感激任何帮助。

2 个答案:

答案 0 :(得分:1)

您可以使用boost::sub_match::matched bool成员:

if(match[index_of_time_group].matched) process_it(match);

也可以在regexp中使用命名组,如:(?<name_of_group>.*),并且上面这行可以更改为:

if(match["name_of_group"].matched) process_it(match);

答案 1 :(得分:0)

从名称/模式对动态构建regex_string,并返回name-&gt;索引映射以及正则表达式。然后编写一些代码来确定匹配是否来自给定名称。

如果你是疯了,你可以在编译时(从标签到索引的映射)进行。这不值得。