2015-05-05 4 views
2

Я пытаюсь подсчитать, сколько вхождений картина имеет в выражении:Бесконечный цикл с RE2 :: FindAndConsumeN

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

тестирования с:

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

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

Благодаря

+0

ли это цикл бесконечно или он застрял в функции FACN? –

+0

@ Цикл Томас бесконечно (совпадения всегда увеличиваются) – Shmoopy

+0

И каков вывод, если вы печатаете '& stringPiece'? –

ответ

0

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

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

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

Фактически, вход меняет, следовательно, «потребляет». – Mekap

0

TL; DR Находка findAndConsume терпит неудачу, потому что не могу найти что-то в начале входа. В противном случае подразумевается, что матч найден, но я предполагаю, что он не может переместить буфер вправо, вызывая цикл infinte.


Согласно header of 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); 
+0

Я хотел бы обрабатывать случаи, когда ввод начинается с шаблона и как там, где он отсутствует. Я интерпретирую «не нужно начинать», так как он может начинаться или не запускаться. Я ошибаюсь? – Shmoopy

+0

Если 'findAndConsume failed', то он не будет в бесконечном цикле –

+0

Входной шаблон и строка даны мне как params. Я хотел бы подсчитать количество вхождений шаблонов в строке, я не хочу подавать на вход, где он будет успешным. – Shmoopy

Смежные вопросы