Я пытаюсь подсчитать, сколько вхождений в шаблоне есть в выражении:
while (RE2::FindAndConsumeN(&stringPiece, regex, nullptr, 0))
{
++matches;
}
Тестирование с помощью:
auto stringPiece = RE2::StringPiece("aaa");
auto regexp = RE2::re2("a*");
Заканчивается циклом, работающим вечно (я ожидал, что он вернет 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);
RE2 :: FindAndConsumeN возвращает bool, если шаблон найден, я не буду вызывать его в цикле while, поскольку ваш шаблон & Источник не меняется.
Это может помочь вам в вызове функции:
re2::RE2::Arg match;
re2::RE2::Arg* args[] = { &match };
re2::RE2::FindAndConsumeN(NULL, pattern, args, 1);