2

パターンが式に何回出現するかを数えようとしています:

while (RE2::FindAndConsumeN(&stringPiece, regex, nullptr, 0))
{
    ++matches;
}

でテストします:

auto stringPiece = RE2::StringPiece("aaa");
auto regexp = RE2::re2("a*");

ループが永遠に実行されることになります(1が返されると予想していました)

ありがとう

4

2 に答える 2

1

TL;DR 入力の先頭に何かが見つからないため、findAndConsume の検索は失敗します。失敗は、一致が見つかったことを意味しますが、バッファを正しく移動できないため、無限ループが発生していると思います。


re2 のヘッダーによると:

  // Like Consume(..), but does not anchor the match at the beginning of the
  // string.  That is, "pattern" need not start its match at the beginning of
  // "input".  For example, "FindAndConsume(s, "(\\w+)", &word)" finds the next
  // word in "s" and stores it in "word".

つまり、「パターン」は「入力」の先頭で一致を開始する必要はありません。

あなたのコードでは、入力の先頭でパターンが一致しているため、間違った動作をしています。

findAndConsume に次のようなものをフィードする場合:

auto stringPiece = RE2::StringPiece("baaa");

ループにこれ以上エラーが発生することはありません。

または、必要に応じて、代わりに ConsumeN() を使用できます。

  // Like FullMatch() and PartialMatch(), except that pattern has to
  // match a prefix of "text", and "input" is advanced past the matched
  // text.  Note: "input" is modified iff this routine returns true.
  static bool ConsumeN(StringPiece* input, const RE2& pattern, // 3..16 args
                       const Arg* const args[], int argc);
于 2015-05-05T08:28:14.027 に答える
0

RE2::FindAndConsumeN は、パターンが見つかった場合に bool を返します。パターンとソースが変更されないため、while ループでは呼び出しません。

これは、関数を呼び出す方法で役立つ場合があります。

re2::RE2::Arg match;
re2::RE2::Arg* args[] = { &match };
re2::RE2::FindAndConsumeN(NULL, pattern, args, 1);
于 2015-05-05T08:28:03.333 に答える