И снова регэкспы в C++
От: okman Беларусь https://searchinform.ru/
Дата: 04.06.11 06:56
Оценка:
Приветствую всех, кто заглянул !

Ищу библиотеку регулярных выражений для C++ под Windows.
Требования:

— полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку
выражений типа "символ выражение символ модификаторы";
— поддержка компиляции в x64;
— производительность на уровне.

Boost.Regex и Boost.Xpressive не подходят — не поддерживается упомянутая форма модификаторов,
PCRE имеет проблемы сборки в Windows, а ее компиляция в x64 выдает такое количество специфичных
предупреждений об усечении типа и других, что заставляет усомниться в том, что она вообще
корректно работает в 64-битных системах. Возможности использовать tr1::regex нет.

Заранее спасибо всем ответившим.
Re: И снова регэкспы в C++
От: jazzer Россия Skype: enerjazzer
Дата: 04.06.11 07:51
Оценка:
Здравствуйте, okman, Вы писали:

O> — полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку

O> выражений типа "символ выражение символ модификаторы";
Что имеется в виду? можно пример?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: И снова регэкспы в C++
От: okman Беларусь https://searchinform.ru/
Дата: 04.06.11 08:20
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Здравствуйте, okman, Вы писали:


O>> — полноценная поддержка Perl-синтаксиса, включая модификаторы и поддержку

O>> выражений типа "символ выражение символ модификаторы";
J>Что имеется в виду? можно пример?

Например, перловский модификатор i (нечувствительность к регистру) можно включить так:
(?i)hello

Эту форму поддерживает Boost.regex.

Но есть и другая форма:
/hello/i

Вот с ней, если не ошибаюсь, умеет работать только PCRE.
Re[3]: И снова регэкспы в C++
От: jazzer Россия Skype: enerjazzer
Дата: 04.06.11 08:36
Оценка: 8 (1) +1
Здравствуйте, 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 (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: И снова регэкспы в C++
От: okman Беларусь https://searchinform.ru/
Дата: 04.06.11 09:06
Оценка:
jazzer, большое спасибо за разъяснения.

J>Ну так это за пределами регэкспов, это уже перловый код, вообще-то (косые скобки — это оператор матчинга, а i — это режим работы этого оператора целиком).

J>А сами регэкспы поддерживают только первую форму, более того, нет другого способа включать/выключать режимы для частей регэкспа, даже в перле, кроме первой формы.
J>Так что, имхо, даже если PCRE и поддерживает такое, это весьма сомнительное расширение, и совсем не регэксп, потому что иначе как ты иначе сматчишь строку именно в таком формате, если она специально трактуется? Не говоря уже о том, что слеши придется экранировать, хотя это и не нужно совсем?

J>Если не секрет, зачем нужна именно такая форма и почему не устраивает первая?

J>Тем более что вторая в первую элементарно транслируется?

Проект представляет собой серию плагинов для различных интернет-браузеров (резалки баннеров и
прочих нежелательных элементов HTML-контента). База данных одна на все плагины, и правила фильтрации
описываются регулярными выражениями. Однако то, что данный синтаксис находится вне спецификации
регулярных выражений, я не знал.
Re[5]: И снова регэкспы в C++
От: jazzer Россия Skype: enerjazzer
Дата: 04.06.11 09:58
Оценка:
Здравствуйте, okman, Вы писали:

O>Проект представляет собой серию плагинов для различных интернет-браузеров (резалки баннеров и

O>прочих нежелательных элементов HTML-контента). База данных одна на все плагины, и правила фильтрации
O>описываются регулярными выражениями. Однако то, что данный синтаксис находится вне спецификации
O>регулярных выражений, я не знал.

Ага. Понятно. В таком случае обычно делается диспетчеризация, т.е. такой мини-язык с таким смыслом: если строка начинается и заканчивается слешами (с опциональными модификаторами), то то, что внутри — это регэксп с соответствующим модификатором в начале, т.е. меняется так:
/xxx/imxs-imxs -> (?imxs-imxs xxx)

а если слешей нет, то это не регэксп, а строка, которая должна матчиться как она есть (т.е. если внутри есть звездочка, то это настоящий символ-звездочка, а не регэксповый квантор), т.е. меняется так:
xxx -> \Qxxx\E

После этого у тебя все превращено в соответствующие регэкспы, его можно скомпилировать и запустить.

Например, AdBlock примерно так себя ведет (хотя я не уверен, что он поддерживает модификаторы).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.