私は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
書式設定時間のグループキャッチ文字列を指しているインデックスを変更すると、変更される可能性があります。
これを行うためのきちんとした方法はありますか?グループに名前を付けるようなものですか?どんな助けにも感謝します。