私は母の誕生日よりも早く正規表現を忘れてしまいます。それは主要なPITAです。とにかく、HTTP 応答ステータス行を解析するための RE が必要で、サブ要素を適切にキャプチャしました。私はこれを機能させました:
const boost::regex status_line("HTTP/(\\d+?)\\.(\\d+?) (\\d+?) (.*)\r\n");
std::string status_test1("HTTP/1.1 200 hassan ali\r\n");
boost::smatch what;
std::cout << regex_match(status_test1,what, status_line, boost::match_extra) << std::endl;
std::cout << what.size() << std::endl;
BOOST_FOREACH(std::string s, what)
{
std::cout << s << std::endl;
}
4 番目のキャプチャ グループは、特に単語のトークン化について、私が大騒ぎしていたものです。しかし、私はそれを必要としないので、私の仕事は終わりました。ただし、「\ 0」で終わるスペースで区切られた文をトークン化する方法を知りたいと思います。これにより、削除された単語のベクトル/配列が得られます。
次のフラグメントを機能させることができません
const boost::regex sentence_re("(.+?)( (.+?))*");
boost::smatch sentence_what;
std::string sentence("hassan ali syed ");
std::cout << boost::regex_match(sentence,sentence_what,sentence_re, boost::match_extra) << std::endl;
BOOST_FOREACH(std::string s, sentence_what)
{
std::cout << s << std::endl;
}
一致するべきではありません"hassan ali syed "
が、一致する必要が"hassan ali syed"
あり、キャプチャグループはhassan
ali
syed
(改行で)出力する必要がありますが、出力しますhassan
syed
syed
(3番目のsyedのスペースに注意してください<space>syed
。キャプチャグループは再帰的なエンティティを処理できないと思いますか?
それで、PCRE構文でトークン化タスクを指定するためのクリーンな方法はありますか?それにより、クリーンなトークンベクトルが得られます(繰り返しなし-つまり、ネストされたグループが空白を取り除こうとしないでください)。
これが仕事に適したツールではないことはわかっています.spirit / lexxまたはboost::tokeniseが最適であり、それが正しい方法ではないこともわかっています. .net では、スクリーン スクレイピングを行うときに、トークンがなくなるまで正規表現を本文に繰り返し適用することで、テキストの本文にトークンを見つけます。