5

何日もハッキングして読んだ後、私はブーストの正規表現エンジンで運がなかった。うまくいけば、ここの誰かが助けてくれるだろう。

すべての行から最初のフィールドを取得し、最後のフィールドが入力と一致するようにします。

string input =
    "449 a dingo ate my baby THING\n"
    "448 a dingo ate my baby THING\n"
    "445 a dingo ate my baby BOOGNISH\n"
    "446 a dingo ate my baby BOOGNISH\n"
    "447 a dingo ate my baby STUFF\n";

正規表現に次の文字列を指定するとします...

string re = "^([0-9]+).+?boognish$";
boost::regex expression(re,boost::regex::perl | boost:regex::icase);

そして、私の試合を設定します

const int subs[] = { 0, 1 };
boost::sregex_token_iterator it(input.begin(), input.end(), expression, subs);
boost::sregex_token_iterator end;

while ( it != end )

{
    fprintf(stderr,"%s|\n", it->str().c_str());
    *it++;
}

これがブーストから得られる出力です。ライン全体とグループ1の試合の両方を要求したことを覚えておいてください。また、「|」も要求しました。したがって、行の終わりを簡単に確認できます。

449     a dingo ate my baby         THING
448     a dingo ate my baby        THING
445     a dingo ate my baby         BOOGNISH|
449|
446     a dingo ate my baby         BOOGNISH|
446|

本当に445が欲しい| および446| のみですが、449(最初のBOOGNISHに到達するまで)、次に446になります。他のリパーサーでこれをテストしましたが、正常に機能しているようです。ブーストで何が間違っているのですか?

前もって感謝します!

4

1 に答える 1

1

この記事によるflag match_not_dot_newlineと、マッチングアルゴリズムに渡す必要があります。それがあなたのケースを解決すると思います。

于 2011-05-26T21:27:10.360 に答える