С++: какую библиотеку регулярных выражений следует использовать?
Я работаю над коммерческим (не открытым исходным кодом) проектом С++, который работает на основе Linux. Мне нужно сделать некоторое регулярное выражение в коде С++. (Я знаю: у меня теперь есть 2 проблемы.)
ВОПРОС: В каких библиотеках люди, регулярно занимающиеся регулярным выражением из C/С++, рекомендуют посмотреть? Быстрый поиск привел к моему вниманию следующее:
1) Boost.Regex(мне нужно прочитать лицензию Boost Software, но этот вопрос не касается лицензий на программное обеспечение)
2) C (не С++) POSIX regex (#include < regex.h > , regcomp, regexec и т.д.)
3) http://freshmeat.net/projects/cpp_regex/ (я ничего не знаю об этом, кажется, GPL, поэтому не может использоваться в этом проекте)
Ответы
Ответ 1
Спасибо за все предложения.
Сегодня я опробовал несколько вещей, и с тем, что мы пытаемся сделать, я выбрал простейшее решение, в котором мне не нужно загружать какую-либо другую стороннюю библиотеку. В конце концов, я #include < regex.h > и использовали стандартные C POSIX вызовы regcomp() и regexec(). Не С++, но в крайнем случае это оказалось самым легким.
Ответ 2
Boost.Regex очень хорош и планируется стать частью стандарта С++ 0x (он уже в TR1).
Лично я считаю Boost.Xpressive гораздо приятнее работать. Это библиотека только для заголовков, и у нее есть некоторые интересные функции, такие как статические регулярные выражения (регулярные выражения, скомпилированные во время компиляции).
Обновление: Если вы используете компилятор, совместимый с С++ 11 (gcc 4.8 НЕ!), используйте std:: regex, если у вас нет оснований использовать что-то еще.
Ответ 3
В прошлых проектах С++ я с успехом использовал PCRE. Он очень полный и проверенный, так как он используется во многих проектах высокого профиля. И я вижу, что Google недавно внедрил набор С++-оберток для PCRE.
Ответ 4
С++ имеет встроенную библиотеку регулярных выражений с TR1. Библиотека регулярных выражений AFAIK Boost очень совместима с ней и может использоваться в качестве замены, если ваша стандартная библиотека не предоставляет TR1.
Ответ 5
Еще два варианта:
Если вы можете написать его в С++ 11 - выполните следующие действия: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339 p >
Примечание:
Во время написания единственной библиотеки регулярных выражений С++ 11, которую я знаю, является clang/llvm one и работает только на Mac. GNU еще еще не реализует regex. Я не знаю о Visual Studio. Большинство людей по-прежнему используют boost regex.
Или вы можете использовать ragel для создания конечного автомата для выполнения синтаксического анализа для вас и генерации реализации кода C/С++: http://www.complang.org/ragel/
Я немного использовал его для генерации кода для синтаксического анализа json. Этот файл ragel: https://github.com/matiu2/yajp/blob/master/parser/number.rl
используется для генерации этого кода
https://github.com/matiu2/yajp/blob/master/parser/json.hpp#L254
и эта схема конечного автомата:
![state diagram]()
Обновление 1:
lvm libС++ regex работает на ubuntu 14.04: libС++ - dev - стандартная библиотека LLVM С++ (файлы разработки). При компиляции: clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...
Обновление 2:
В настоящее время я наслаждаюсь boost spirit 3 - мне нравится больше, чем регулярное выражение, потому что у него есть BNF правила стиля и хорошо продуманы. (Более поздний (более документированный) Spirit Qi libs найден здесь)
Ответ 6
Boost имеет regex в нем.
Это должно заполнить счет
Ответ 7
Вы также можете посмотреть библиотеку быстрых регулярных выражений, которая была разработана в Yandex поисковой системе для выполнения быстрые совпадения тысяч шаблонов против огромных объемов данных.
Ответ 8
Я лично всегда использовал boost.regex(хотя у меня нет необходимости в регулярном выражении на С++). Microsoft Labs также имеет библиотеку регулярных выражений, называемую GRETA: http://research.microsoft.com/projects/greta/. По-видимому, это очень быстро и имеет целый синтаксис Perl 5. Я не использовал его, но вы можете проверить его.
Ответ 9
Я столкнулся с подобной ситуацией и в конечном итоге использовал двигатель Генри Спенсера Regexp
http://www.codeproject.com/KB/string/spencerregexp.aspx
Ответ 10
Никто здесь ничего не сказал о том, что поставляется с С++ 0x.
Если вы используете компилятор и STL, который поддерживает С++ 0x, вы можете просто использовать это вместо наличия другой библиотеки в вашем проекте.