1

私はboost::regexを使用して、'%'記号がエスケープ文字であるフォーマット文字列を解析しています。私はboost::regexの経験があまりないので、正直に言うと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書式設定時間のグループキャッチ文字列を指しているインデックスを変更すると、変更される可能性があります。

これを行うためのきちんとした方法はありますか?グループに名前を付けるようなものですか?どんな助けにも感謝します。

4

2 に答える 2

1

boost::sub_match::matchedboolメンバーを使用できます:

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

regexpで次のような名前付きグループを使用することもでき(?<name_of_group>.*)ます。上記の行を次のように変更できます。

if(match["name_of_group"].matched) process_it(match);
于 2012-11-28T19:48:41.013 に答える
0

名前/パターンのペアから動的に構築regex_stringし、名前->インデックスマッピングと正規表現を返します。次に、一致が特定の名前に由来するかどうかを判断するコードを記述します。

正気でない場合は、コンパイル時に実行できます(タグからインデックスへのマッピング)。それは価値がありません。

于 2012-11-28T19:52:46.157 に答える