Ищу библиотеку регулярных выражений для C++ под Windows.
Требования:
— полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку
выражений типа "символ выражение символ модификаторы";
— поддержка компиляции в x64;
— производительность на уровне.
Boost.Regex и Boost.Xpressive не подходят — не поддерживается упомянутая форма модификаторов,
PCRE имеет проблемы сборки в Windows, а ее компиляция в x64 выдает такое количество специфичных
предупреждений об усечении типа и других, что заставляет усомниться в том, что она вообще
корректно работает в 64-битных системах. Возможности использовать tr1::regex нет.
Здравствуйте, okman, Вы писали:
O> — полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку O> выражений типа "символ выражение символ модификаторы";
Что имеется в виду? можно пример?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, okman, Вы писали:
O>> — полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку O>> выражений типа "символ выражение символ модификаторы"; J>Что имеется в виду? можно пример?
Например, перловский модификатор i (нечувствительность к регистру) можно включить так:
(?i)hello
Эту форму поддерживает Boost.regex.
Но есть и другая форма:
/hello/i
Вот с ней, если не ошибаюсь, умеет работать только PCRE.
Здравствуйте, okman, Вы писали:
O>Здравствуйте, jazzer, Вы писали:
J>>Здравствуйте, okman, Вы писали:
O>>> — полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку O>>> выражений типа "символ выражение символ модификаторы"; J>>Что имеется в виду? можно пример?
O>Например, перловский модификатор i (нечувствительность к регистру) можно включить так: O>
(?i)hello
O>Эту форму поддерживает Boost.regex.
O>Но есть и другая форма: O>
/hello/i
O>Вот с ней, если не ошибаюсь, умеет работать только PCRE.
Ну так это за пределами регэкспов, это уже перловый код, вообще-то (косые скобки — это оператор матчинга, а i — это режим работы этого оператора целиком).
А сами регэкспы поддерживают только первую форму, более того, нет другого способа включать/выключать режимы для частей регэкспа, даже в перле, кроме первой формы.
Так что, имхо, даже если PCRE и поддерживает такое, это весьма сомнительное расширение, и совсем не регэксп, потому что иначе как ты иначе сматчишь строку именно в таком формате, если она специально трактуется? Не говоря уже о том, что слеши придется экранировать, хотя это и не нужно совсем?
Если не секрет, зачем нужна именно такая форма и почему не устраивает первая?
Тем более что вторая в первую элементарно транслируется?
jazzer, большое спасибо за разъяснения.
J>Ну так это за пределами регэкспов, это уже перловый код, вообще-то (косые скобки — это оператор матчинга, а i — это режим работы этого оператора целиком). J>А сами регэкспы поддерживают только первую форму, более того, нет другого способа включать/выключать режимы для частей регэкспа, даже в перле, кроме первой формы. J>Так что, имхо, даже если PCRE и поддерживает такое, это весьма сомнительное расширение, и совсем не регэксп, потому что иначе как ты иначе сматчишь строку именно в таком формате, если она специально трактуется? Не говоря уже о том, что слеши придется экранировать, хотя это и не нужно совсем?
J>Если не секрет, зачем нужна именно такая форма и почему не устраивает первая? J>Тем более что вторая в первую элементарно транслируется?
Проект представляет собой серию плагинов для различных интернет-браузеров (резалки баннеров и
прочих нежелательных элементов HTML-контента). База данных одна на все плагины, и правила фильтрации
описываются регулярными выражениями. Однако то, что данный синтаксис находится вне спецификации
регулярных выражений, я не знал.
Здравствуйте, okman, Вы писали:
O>Проект представляет собой серию плагинов для различных интернет-браузеров (резалки баннеров и O>прочих нежелательных элементов HTML-контента). База данных одна на все плагины, и правила фильтрации O>описываются регулярными выражениями. Однако то, что данный синтаксис находится вне спецификации O>регулярных выражений, я не знал.
Ага. Понятно. В таком случае обычно делается диспетчеризация, т.е. такой мини-язык с таким смыслом: если строка начинается и заканчивается слешами (с опциональными модификаторами), то то, что внутри — это регэксп с соответствующим модификатором в начале, т.е. меняется так:
/xxx/imxs-imxs -> (?imxs-imxs xxx)
а если слешей нет, то это не регэксп, а строка, которая должна матчиться как она есть (т.е. если внутри есть звездочка, то это настоящий символ-звездочка, а не регэксповый квантор), т.е. меняется так:
xxx -> \Qxxx\E
После этого у тебя все превращено в соответствующие регэкспы, его можно скомпилировать и запустить.
Например, AdBlock примерно так себя ведет (хотя я не уверен, что он поддерживает модификаторы).