LINUX.ORG.RU

Регулярные выражения в C++


0

0

19 сентября вышел очередной релиз 0.8 библиотеки PCRE++. Это ничто иное как объектно ориентированная обёртка для известной библиотеки PCRE (http://www.pcre.org) с поддержкой механизма исключений.

В новой версии я исправил ошибку возникающую при инсталяции пакета не системным администратором (например обычным пользователем в свой домашний каталог). Также добавлен метод определения заголовочных файлов к библиотеке PCRE исправляющий ошибки при компиляци пакета на некоторых системах.

Сама библиотека чрезвычайно проста: состоит из двух файлов (заголовочного и определение всего одного класса).

http://www.co.daemon.de/en/software/p... ftp://ftp.daemon.de/scip/Apps/pcre++/

>>> Качать

woooooow...

anonymous
()

а оно может выделять все числа в мат записи? 

на перле регексп выглядит как-то так:

#!/usr/bin/perl
$_=qq~
1234
34 -4567
 3456
-0.35e-0,2  fff
    56grf45
-.034 E20
     -.034 e2,01   -,045 e-,23
  -,034 e201  3e-.20
-,045 e-,23 e-0.88

4 E-0.20
22 
E-21 ggg
 -0.2 w         4 3
345
2 ^-,3
~;
print "$1\n" while 
 m%(([+-]?(?=\d|[\.,]\d)\d*([\.,]\d*)?((\se|e|\s?\^)
    ([-+]?\d*[,\.]?)\d+)?)|([+-]?e[+-]?\d*[,.]?\d+))%gxi;


Позволяет эта библиотека делать подобные вещи?

vilfred ☆☆
()

2vilfred

Языка, сопоставимого с перлом по комфортности в программировании просто нет, сравнивать его не с чем, так что и не надо.

>Позволяет эта библиотека делать подобные вещи?

Дело не в библиотеке, а в том, что решать подобные весьма хитровыебнутые (но вполне реальные) задачи на C++ не следует - он для этого слишком неудобен.

anonymous
()

>Языка, сопоставимого с перлом по комфортности в программировании просто нет, сравнивать его не с чем, так что и не надо.

Блажен кто верует...

> ... решать подобные весьма хитровыебнутые (но вполне реальные) задачи на C++ не следует - он для этого слишком неудобен
а для чего он еще нужен, как ни для хитровыебнутых вещей?
Это "hello, world" писать можно и на VBasic писать..
А все, что посложней - лучше на с++.
Правда, нужна определенная квалификация, но где это не так ;)

А по поводу "регексп" на с++, то для этого есть www.boost.org

anonymous
()

> Блажен кто верует...

Я не верую, я это вижу по количеству операторов, необходимых на решение разных задач.

>а для чего он еще нужен, как ни для хитровыебнутых вещей?

Эта "хитровыебнутость" является таковой непростой, только если использовать C++.

anonymous
()

Ещё Java и .Net присовокупите для спору... Каждому овощу свою грядку.

Хотя деление на Perl-удобно против C/C++-быстро вполне допускаю. :-))

anonymous
()

Может я чего то не понимаю, но на кой изобретать велосипед?
уже как лет лет есть мултиплатформеная (по крайней мере собираетсья на win32 и UnixLike) и фришная С++ либа
http://www.geocities.com/SiliconValley/Peaks/8778/pubdom.html

я к сожалению не знаком с PCRE, вероятно там куча всего наворочено, но это в 99% случаев не надо..

насчет перла.. дык никто не против оного, просто для парсинга конфигов и прочей муры на С++ вызывать внешний модуль (да еще не perl) полный и никому не нужный гимор. Так что каждому свое..

P.S. Если звезды зажигаються, значит это кому то нужно (с).


ifconfig
()

> на кой изобретать велосипед?

Да просто упражняется народ в программировании, пользу хочет людям принести. Я приветствую такие наработки, от них "станет всем теплей". Глядишь, через годик в дистрибы пойдет, как стандартная (т.е. нужная).

anonymous
()

>>да еще не perl
сорри, очапатка.. имеллось ввиду НА перл


>>Глядишь, через годик в дистрибы пойдет, как стандартная (т.е. нужная).
Гм :) а вот это маловероятно...
а вот насчет "упражняться" да кнечно.. кто против то .. я тоже только за..
только, помоему, есть куча других применений своих сил..

Кстати, вопрос к автору. Либа собираеться без напильника под win32 к примеру VisualC++ ?





ifconfig
()

>Языка, сопоставимого с перлом по комфортности в программировании просто нет, сравнивать его не с чем, так что и не надо.

Я тоже так думал. Потом установил ruby и почувствовал разницу. После него перл уже не перл.

anonymous
()

Ну так ruby ему родственник довольно близкий. А чем он оказался лучше? :)

anonymous
()

2 anonymous (*) (2002-09-25 19:27:13.381) А ты напиши та perl большой проект. И попытайся в нем через неделю разобраться. Сразу понятно станет чем Python/Ruby лучше. Perl это очень хороший язык для создания КОРОТКИХ скриптов.

MrKooll ★★★
()

А мне в перле очень нравится, что (окромя регэкспов) массивы и хэши вставлены в язык на уровне синтаксиса и все круто заточено для удобства операций с ними. После перла на C++ переключаюсь с рвотным пакетиком в руках.

anonymous
()

А чем не устраивает boost::regex?

Alexey Voinov <voins@voins.program.ru>

anonymous
()

IMHO интерфейс неубедителен. Всегда найдется какой-нибудь даун,
который вызовет matches перед search. И, что серьезнее, для каждого 
Pcre в данный момент лишь один matchset.

Разумнее на мой взгляд:

class Pcre;

class matchset
{
    ...
public:
    matchset(const Pcre &, cost string &);
    ~matchset();
    int num_matches() const;
    const string &match(int i) const;
};

И использовать:

Pcre p("...");
matchset m1(p, "...#1"), m2(p, "...#2");

IoP
()

Блин, к чему весь флейм? Это удобно, а это неудобно, а я двумя ногами умею ... ;) PCRE и в Африке PCRE - ПЕРЛОВЫЕ РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ, которые строятся по тем же правилам как и в Перле, поэтому высказывания типа "а можно ли как в Перле" - бестолковы, ибо не можно , а нужно. Кстати, страждущим, я уже с годик REGEXX-0.98 юзаю, тоже приплюснутый интерфейс к PCRE, и вобщем то доволен.

PETER ★★
()
Ответ на: комментарий от anonymous


> А мне в перле очень нравится, что (окромя регэкспов) массивы и хэши
> вставлены в язык на уровне синтаксиса и все круто заточено для
> удобства операций с ними. После перла на C++ переключаюсь с рвотным
> пакетиком в руках.

Как сказал предыдущий оратор: "Perl это очень хороший язык для создания КОРОТКИХ скриптов", поддерживать большие и толстые вещи гемор ещё тот.
А напредмет всего встроенного (массивы и хэши) очень советую потрогать Python; регэкспы там тоже есть, и кстати, ничем не уступают перловым, а еще есть замечательная возможность их прекомпиляции. Код на питоне значительно короче и читабельнее чем аналогичный на перле.

А меня начинает подташнивать от тысячестрочных перловых программ, где ссылка на ссылке, указатель на указателе (дабы эта дура по сотне раз одно и тоже не копировала).

Misantrop
()

Если, честно, то я и не надеялся, что данная ветка будет столь конструктивной что пополнит мою личную коллекцию ссылок и архив исходников очень полезным материалом :-). Итак по-порядку:

2 ifconfig (*) (2002-09-25 19:01:03.39)

> http://www.geocities.com/SiliconValley/Peaks/8778/pubdom.html > Может я чего то не понимаю, но на кой изобретать велосипед?

Библиотека PCRE++ - не единственная реализация механизма регулярных выражений в C++. Но в сравнени с этой либой у неё есть преимущества: большие возможности Perl regexp в сравнении с традиционными, более правильная (на мой взгляд) LGPL лицензия, чем Public Domain. Также не может не радовать большая лёгкость PCRE++: всего два файла, из которых, кстати не обязательно собирать библиотеку (libpcre++.*) -достаточно включить исходный текст файлов в своей проект - и всё соберётся как по-маслу.

> Кстати, вопрос к автору. Либа собираеться без напильника под win32 к примеру VisualC++ ?

А о каком авторе речь идёт - данной новости или самой либы PCRE++?

Автор PCRE++ - Thomas Linden. Но за себя могу сказать, что с MS Windows экспериментов пока не проводил. Вот собираюсь оттестировать сборку но в более правильных средах: Cygwin (http://www.cygwin.com) и DJGPP (http://www.delorie.com/djgpp).

Хотя думаю успех будет зависеть только от успеха установки библиотеки pcre.

Вот ещё есть проект GNU Win32 (http://gnuwin32.sourceforge.net) - так там ребята PCRE собрали (http://gnuwin32.sourceforge.net/packages/pcre.htm).

2 Alexey Voinov <voins@voins.program.ru> (2002-09-25 21:55:59.897):

> А чем не устраивает boost::regex?

Можно бы и ссылкой тыкнуть http://www.boost.org/libs/regex/.

Мне либа очень понравилась, особенно тем, что она поддерживает диалект POSIX Regexp. Ещё, в качестве строк, в отличае от PCRE++ используется класс-шаблон basic_string<>, что позволяет работать, например, со строками Unicode. Из недостатков - громоздкость либы, и главное - у её автор не даёт распространять библиотеку без договорённости с ним.

2 PETER (*) (2002-09-26 08:33:04.614)

> ...я уже с годик REGEXX-0.98 юзаю...

Опять же забыл ссылки привести, откуда взял исходники.

Вот я порывшись в сети кое-что нашёл на эту тему:

http://bazar.conectiva.com.br/~niemeyer/projects/regexx/ (там до версии 0.97).

http://download.sourceforge.net/regexx/ (вот тут вроде посвежее - хотя последние обновления были сделаны в 2000 году).

В принципе достойная альтернатива, хотя и несколько тяжеловата, и несёт в себе старую pcre.

Ну и напоследок оспорю утверждение ifconfig'а

>>Глядишь, через годик в дистрибы пойдет, как стандартная (т.е. нужная). >Гм :) а вот это маловероятно...

А у тех либ вероятность попасть в дистр ещё меньше (может только regexx будет конкурировать). И основная причина в том что пакет pcre уже входит почти во все дистры с Линуксом. Например в моём Red Hat 7.3:

$ rpm -qa|grep pcre

pcre-devel-3.9-2

pcre-3.9-2

ну и лёгкость с лицензий - тоже приятные вещи. Хотя ещё есть над чем работать: реализовать шаблоны C++ для строк поиска и образцов, и написать spec для SRPM. Может кто ещё и для debian'а спортирует?

Пока это всё же пререлиз.

PS:

В одном из интервью журналу LinuxWorld ( http://www.softcraft.ru/paradigm/common/siw.shtml ) Бьерн Страуструп сказал: я бы хотел видеть в стандарте библиотеку с образцами, обеспечивающими разбор регулярных выражений (Regular expression matching).

Так что, может и оказаться так, что всё в этом мире придёт к общему знаменателю. Нужно только подождать.

Android
() автор топика
Ответ на: комментарий от PETER

гы, если можно то напиши, приведи пример... делов то...

vilfred ☆☆
()

2Android
>Можно бы и ссылкой тыкнуть http://www.boost.org/libs/regex/.
>... и главное - у её автор не даёт распространять библиотеку без договорённости с ним.

Многоуважемый коллега,
поясните пожалуйста, что вы имели ввиду?

http://www.boost.org/libs/regex/introduction.htm:

Regex++, Introduction.

Copyright (c) 1998-2001

Dr John Maddock

Permission to use, copy, modify, distribute and sell
this software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation.
Dr John Maddock makes no representations about the suitability of
this software for any purpose.
It is provided "as is" without express or implied warranty.

>Бьерн Страуструп сказал: я бы хотел видеть в стандарте библиотеку с образцами,
обеспечивающими разбор регулярных выражений (Regular expression matching).

Кстати, одна из целей boost, это подготовить новый стандарт для с++

anonymous
()
Ответ на: комментарий от Android

вот не понимаю я этих аргументов типа "более правильная (на мой взгляд) LGPL лицензия" - это что, когда вы проги пишите, над вами адвокат что-ли стоит?

"Хотя думаю успех будет зависеть только от успеха установки библиотеки pcre" - вот вот, еще и установить надо...

"Из недостатков - громоздкость либы, и главное - у её автор не даёт распространять библиотеку без договорённости с ним" - т.е. лицензионная, в этом то и отличие цпана...

ну, си это здорово, конечно, я на нем не умею, и иногда жалею, но на перл наезжать не надо!!!

vilfred ☆☆
()

to ifconfig

>насчет перла.. дык никто не против оного, просто для парсинга конфигов >и прочей муры на С++ вызывать внешний модуль (да еще не perl) полный и >никому не нужный гимор. Так что каждому свое..

Мне показалось Вы думаете, что модуль написан не на С++, а на перл. Разуверьте меня, плиз :)

NVadim
()

2 anonymous (*) (2002-09-26 12:24:43.942)

Пардон, не правильно я понял фразу "granted without fee" из лицензии boost::Regex++. Каюсь. Но всё равно - это не есть в духе GNU.

Android
() автор топика

>>с MS Windows экспериментов пока не проводил.
дак провидите. Мультплатформеность великая штука, которая в большинстве случаев перевешивает все остальные аргументы всместе взятые.

>>Вот собираюсь оттестировать сборку но в более правильных средах: Cygwin (http://www.cygwin.com) и DJGPP (http://www.delorie.com/djgpp).

Ну ну :) Чем меряли "правильность" ??
Вы еще заведите очередную байду на тему VC++ (6.0) vs g++

>>А у тех либ вероятность попасть в дистр ещё меньше (может только regexx будет конкурировать).

Вот тут вы, наверное, правы. Хотя остутсвие стандартной либы в дистрах не сильно меня беспокоило до сих пор. Все одно, если говорить о продукте, который вы напишите и будете распостранять, то лучше "все свое ношу с собою" как это делает Oracle к примеру. Ибо если эта либа и войдет в большинство дистров, то обязательно найдеться и такой, где ее не будет.

>> Мне показалось Вы думаете, что модуль написан не на С++, а на перл. Разуверьте меня, плиз :)

Это была опечатка..я об этом написал кстати.
я иммел ввиду, что для проги на С++ дергать внешние модули писаные на перл к примеру, для того чтобы распарсить пару строчек, совершенно не оправдано да и просто не удобно. Посему наличие C++ regexp либы есть очень полезная штука. Вопрос какой имеено либы? :)


>>Каюсь. Но всё равно - это не есть в духе GNU.
Ой.. прям опять религия.. GNU - не GNU... разница какая..

ifconfig
()
Ответ на: комментарий от PETER

Форма ответа:
1. Обозначение проблемы.
2. Предлагаемое решение.

Остальное не принимается.

IoP
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.