Комментарии 23
Если я правильно понял документацию (под рукой нет ни библиотеки, ни даже компилятора C++), то как-то так:
std::string text("multiline\ntext"); int lineno = 2; std::ostringstream replacement; replacement << "sprintf '%05d ', " << lineno++; re2::RE2::GlobalReplace(&text, "^", replacement.str());
А, тьфу ты, не выполнит, конечно. В любом случае, это отличие плюсов от перла, регекспы не меняются в обоих случаях. Вот:
replacement << setfill('0') << setw(5) << lineno++;
Весьма интересно. Но надо понимать, что линейное время поиска и расход памяти даются далеко не даром: принципиально не позволяют реализовать ряд фич вроде сверхжадных квантификаторов, опережающих и ретропроверок и тем более рекурсий и обратных вызовов. Плюс ряд возможностей вроде сохраняющих скобок и квантификаторов с указанным большим числом повторов весьма дороги в реализации.
В TCL гибридный механизм, который работает скорее как DFA, нежели NFA.
ЕМНИП там DFA ищет образец целиком, а потом на него натравливается NFA. Т.е. с точки зрения расхода ресурсов это все-таки NFA, в котором DFA-дополнение используется в целях оптимизации
Но работает он с DFA-скоростью, т.е. в любом случае, есть ли совпадение или нет, он требует одинаковое время для поиска.
Вау! 2010 год, а плюс-плюсники открыли для себя регулярные выражения
Странно, что в сырцах есть как файл nfa.cc так и dfa.cc, таки решение гибридное, если судить по коду в re2.cc.
Почитал только что список возможностей — подожду использовать, пока не сделают обратные ссылки и опережающую \ ретроспективную проверки. Никто не тестил на скорость относительно PCRE?
вы статью читали? Там по ссылкам есть тестирование скорости относитлеьно PCRE
Прошу прощенья, не нашел с первого раза :)
Если кому-то интересно — сравнение тут.
Если кому-то интересно — сравнение тут.
Обе эти фичи на DFA нереализуемы принципиально. С ними о линейности требований к ресурсам можно забыть.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
RE2 — новая библиотека регулярных выражений