Бесконечный цикл с RE2 :: FindAndConsumeN

Я пытаюсь подсчитать, сколько вхождений в шаблоне есть в выражении:

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

Тестирование с помощью:

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

Заканчивается циклом, работающим вечно (я ожидал, что он вернет 1)
Кто-нибудь знает, как я использую это неправильно?

Спасибо

2

Решение

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);
1

Другие решения

RE2 :: FindAndConsumeN возвращает bool, если шаблон найден, я не буду вызывать его в цикле while, поскольку ваш шаблон & Источник не меняется.

Это может помочь вам в вызове функции:

re2::RE2::Arg match;
re2::RE2::Arg* args[] = { &match };
re2::RE2::FindAndConsumeN(NULL, pattern, args, 1);
0

По вопросам рекламы [email protected]