Об этом проекте

RE2 — это эффективная и принципиально продуманная библиотека регулярных выражений, первоначально разработанная в Google в 2006 году. Её главная цель проектирования — безопасность: она должна безопасно обрабатывать регулярные выражения от недоверенных пользователей без риска катастрофического обратного поиска или атак типа «отказ в обслуживании». В отличие от традиционных движков, таких как PCRE, Perl или модуль re в Python, RE2 гарантирует, что время сопоставления линейно зависит от длины входной строки. Ключевые особенности включают: - **Безопасность**: RE2 избегает рекурсии и ограничивает использование памяти с помощью настраиваемого бюджета, корректно завершая работу при его исчерпании. Это предотвращает переполнение стека и экспоненциальный рост времени выполнения, характерные для движков с обратным поиском. - **Производительность**: хотя для простых шаблонов она не всегда быстрее других движков из-за накладных расходов на параллельную оценку, она обеспечивает стабильную производительность на сложных выражениях, оценивая альтернативы параллельно, а не последовательно. - **Поддержка синтаксиса**: в режиме Perl по умолчанию принимаются большинство операторов Perl, за исключением тех, которые требуют обратного поиска (например, обратные ссылки и утверждения просмотра). В режиме POSIX поддерживается стандартный синтаксис POSIX (egrep) с сопоставлением по самому левому и самому длинному совпадению. - **Обработка Unicode**: RE2 работает непосредственно с кодовыми точками Unicode и не выполняет нормализацию. При необходимости пользователи должны заранее нормализовать входные данные и шаблоны. Библиотека реализована на C++ и требует компилятор с поддержкой C++17 и библиотеку Abseil. Её можно собрать с помощью GNU make, CMake или Bazel. Несмотря на то что она является нативной для C++, существуют официальные обёртки для Python (`google-re2`), а также порты сообщества для Node.js, Java (RE2J), JavaScript (RE2JS), D, Erlang, OCaml, Perl, R, Ruby и WebAssembly. Другие языки, такие как Go и Rust, предлагают похожие библиотеки, следующие принципам RE2, но не разделяют с ней код.