Функция поиска и замены с regular expressions
Кто ищет, тот найдёт.
Если кому-нибудь ещё такое надо, собщаю: нашёл либу вот по этому адресу
Порекомендуйте, плиз, какую-нибудь функцию (я исходник на C/C++ имею в виду) для поиска и замены в строке, поддерживающую regular expressions типа "[0-9]{2}(.*?)[0-9]", неохота самому писать, знаю же, что всё уже написано до нас.
В принципе рег. выражения позволяют создавать и использовать любые шаблоны, на то они и рег. выражения :) . Ниже привожу изыскания г-на Garik'а aka Просто Хороший Человек, помещённые им в форуме progz.ru:
"Итак, для себя я выбор сделал, хочу поделиться результатами своих изысканий - может кому еще пригодится.
Кстати, сразу извиняюсь за некоторые неточности - немного торопился.
Итак, открывает список библиотека RegEx.
Сайт: http://www.gnu.org/directory/regex.html
В исходниках, распространяется по лицензии GNU.
Насколько мне удалось разобраться, эта библиотека является прародительницей почти всех остальных библиотек для работы с регулярными выражениями.
Структура библиотеки предельно проста - всего 2 файла: H и CPP.
Однако, на этом плюсы этой библиотеки, которые мне удалось найти, заканчиваются и начинаются минусы. Библиотека очень старая! Последняя версия 0.12 датируется апрелем 1993 года. Библиотека абсолютно не заточена под современные среды разработки. Кроме того, очень мало документации и совсем нет примеров (что, впрочем, характерно для проектов GNU).
Следующая библиотека - RX (не путать с RXlib для Delphi).
Сайт: http://www.gnu.org/directory/rx.html
Это тоже GNU-проект. Насколько я понял, базируется на RegEx.
Все те же недостатки, плюс сложная структура библиотеки - много файло, назначение которых непонятно. Документации минимум.
Библиотека поновее RexEx, но тоже очень старая - последняя версия 1.5 датирована ноябрем 1996 года.
Далее идет PCRE (Perl Compatible Regular Expressions).
Сайт: http://www.pcre.org
Распространяется по лицензии SourceForge, но есть версия и на GnuWin32.
Библиотека полностью поддерживает синтаксис регулярных выражений Perl5. Нормально поддерживается - последняя версия 4.5 датирована маем 2003 года. С документацией и примерами, правда, тоже туговато. Как и с адаптацией к средствам разработки под Windows (ориентирована библиотека в основном на Unix-компиляторы).
Далее по списку - GRETA.
Сайт: http://research.microsoft.com/projects/greta/
Библиотека Microsoft, распространяется бесплатно в составе пакета PowerTools.
Библиотека небольшая, достаточно простая, поддерживает синтаксис Perl5, заточена под среду Visual C++. В документации написано, что она самая быстрая из всех (не проверял). Из недостатков отмечу только отсутствие в документации примеров.
Последняя версия - 2.6.4, датирована июлем 2003 года.
И наконец, на сладкое - то, на чем я остановил свой выбор - библиотека Boost.
Сайт: http://www.boost.org
Как любезно поянил мне Влад, эта библиотека - набор компонентов, которые проходят обкатку перед включением в Стандарт C++. В числе прочих там есть библиотека Boost.Regex для работы с регулярными выражениями.
Библиотека шаблонная, поэтому может работать с любыми типами строк. Возможностей очень много. Плюс хорошая документация с большим количеством примеров.
Библиотека заточена под множество современных сред, в том числе Visual C++ и C++Builder. Ставится легко и без проблем (проверял).
Кроме того, отлично поддерживается - последняя версия - 1.31.0 от 26.01.2004.
Ничего лучше я не нашел. Потому на ней и остановился.
:) "
Мне понравилась GRETA, по объёму она на библиотеку не тянет, зато подключать и работать с ней удобнее, чем например Boost.regex. Самое то, если не хочется сильно отвлекаться от создаваемой проги. GRETA не работает в Builder'e, я хотел использовать - ан не получается.
Зато Boost.regex можно использовать на 4 компиляторах. Пробовал в Builder'е, вроде работает.
А с PCRE у меня (в VC++) пробема: рег. выражение после использования не хочет освобождать память, даже если использовать предусмотренную для этого фичу, в цикле кошмар получается :( .
Вот здесь об этой библиотеке на русском языке.
Спасибо за столь исчерпывающий ответ, NightSleeper!