C++

индекс
236,50

RE2 — новая библиотека регулярных выражений

Вчера Google выпустил новую библиотеку регулярных выражений — RE2. Библиотека написана на C++.

Существует два подхода к реализации регулярных выражений: недетерминированные конечные автоматы (NFA) и детерминированные конечные автоматы (DFA). Первый механизм регулярных выражений используется, например, в Perl, Python, Ruby и .NET. К сожалению, в этом случае время работы программы может расти экспоненциально, а также может неограниченно расти использование стека. Такое поведение оказалось неприемлемым для таких проектов Google, как Code Search, Sawzall и Bigtable, поэтому программисты компании написали библиотеку на основе детерминированных конечных автоматов. RE2 гарантирует линейную скорость выполнения поиска и ограниченное использование стека. DFA также используется, например, в lex и egrep. В отличие от большинства подобных реализаций RE2 поддерживает почти все основные возможности PCRE.

Библиотека распространяется под BSD лицензией.

UPD: Убрал Tcl из примеров NFA, сейчас там используются DFA.
+39
12 марта 2010, 18:16
32

комментарии (23)

НЛО прилетело и опубликовало эту надпись здесь
0
kureimoru #
Если я правильно понял документацию (под рукой нет ни библиотеки, ни даже компилятора C++), то как-то так:

std::string text("multiline\ntext");
int lineno = 2;
std::ostringstream replacement;
replacement << "sprintf '%05d ', " << lineno++;
re2::RE2::GlobalReplace(&text, "^", replacement.str());
НЛО прилетело и опубликовало эту надпись здесь
0
kureimoru #
А, тьфу ты, не выполнит, конечно. В любом случае, это отличие плюсов от перла, регекспы не меняются в обоих случаях. Вот:

replacement << setfill('0') << setw(5) << lineno++;
НЛО прилетело и опубликовало эту надпись здесь
0
kureimoru #
Да, этого с ней сделать не получится. Все функции замены (и проверки) в библиотеке принимают фиксированные строковые значения и вызов сторонних функций или callback'и на каждую замену не поддерживают.
+4
Bonart #
Весьма интересно. Но надо понимать, что линейное время поиска и расход памяти даются далеко не даром: принципиально не позволяют реализовать ряд фич вроде сверхжадных квантификаторов, опережающих и ретропроверок и тем более рекурсий и обратных вызовов. Плюс ряд возможностей вроде сохраняющих скобок и квантификаторов с указанным большим числом повторов весьма дороги в реализации.
–8
tpolm #
спасибо, Кэп!
0
impwx #
В TCL гибридный механизм, который работает скорее как DFA, нежели NFA.
0
kureimoru #
Да, вы правы, в той же статье Tcl вспоминают в контексте DFA, а не NFA. Я поправил пост.
0
Bonart #
ЕМНИП там DFA ищет образец целиком, а потом на него натравливается NFA. Т.е. с точки зрения расхода ресурсов это все-таки NFA, в котором DFA-дополнение используется в целях оптимизации
0
impwx #
Но работает он с DFA-скоростью, т.е. в любом случае, есть ли совпадение или нет, он требует одинаковое время для поиска.
0
Bonart #
Нет — DFA-скорость при возможности достигается, но в общем случае не гарантируется. Главное преимущество чистого DFA для гугла (не надо думать об оптимизации самого регэкспа) в этом случае не реализуется.
–19
rev #
Вау! 2010 год, а плюс-плюсники открыли для себя регулярные выражения
+9
NeonMercury #
Вы, как я понял, не пишите на плюсах, не понимаете о чём идёт речь, так зачем холиварить?!
Просто появилась ещё одна либа для регэкспов, не более
–12
rev #
Ваша логическая цепочка обрывается на первой половине предложения. Писал, теперь вот по таким постам не жалею, что слез. Спасибу автору.
0
stab #
Странно, что в сырцах есть как файл nfa.cc так и dfa.cc, таки решение гибридное, если судить по коду в re2.cc.
0
Bonart #
Тогда нужны точные критерии, когда подрубается NFA (подозреваю, что при использовании сохраняющих скобок), иначе слова о линейном потреблении ресурсов останутся только словами.
+1
impwx #
Почитал только что список возможностей — подожду использовать, пока не сделают обратные ссылки и опережающую \ ретроспективную проверки. Никто не тестил на скорость относительно PCRE?
0
tpolm #
вы статью читали? Там по ссылкам есть тестирование скорости относитлеьно PCRE
0
impwx #
Прошу прощенья, не нашел с первого раза :)
Если кому-то интересно — сравнение тут.
0
Bonart #
Обе эти фичи на DFA нереализуемы принципиально. С ними о линейности требований к ресурсам можно забыть.
0
impwx #
А жаль!

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.