Я работаю над коммерческим (не открытым исходным кодом) проектом C ++, который работает в системе на основе Linux. Мне нужно сделать регулярное выражение в коде C ++. (Знаю: у меня сейчас 2 проблемы.)
ВОПРОС: Какие библиотеки рекомендуют мне изучить люди, которые регулярно используют регулярные выражения на C / C ++? Быстрый поиск привлек мое внимание к следующему:
1) Boost.Regex (мне нужно прочитать лицензию на программное обеспечение Boost, но этот вопрос не о лицензиях на программное обеспечение)
2) Регулярное выражение POSIX C (не C ++) (#include <regex.h>, regcomp, regexec и т. Д.)
3) http://freshmeat.net/projects/cpp_regex/ (я ничего не знаю об этом; похоже, GPL, поэтому не может использоваться в этом проекте)
Ответы:
Boost.Regex очень хорош и должен стать частью стандарта C ++ 0x (он уже в TR1).
Лично мне работать с Boost.Xpressive намного приятнее. Это библиотека, предназначенная только для заголовков, и у нее есть некоторые приятные функции, такие как статические регулярные выражения (регулярные выражения, скомпилированные во время компиляции).
Обновление: если вы используете компилятор, совместимый с C ++ 11 (gcc 4.8 НЕ!), Используйте std :: regex, если у вас нет веских причин использовать что-то еще.
источник
Спасибо за все предложения.
Сегодня я опробовал несколько вещей, и из того, что мы пытаемся сделать, я выбрал простейшее решение, при котором мне не нужно загружать какую-либо стороннюю библиотеку. В конце я #include <regex.h> и использовал стандартные вызовы POSIX C regcomp () и regexec (). Не C ++, но в крайнем случае это оказалось самым простым.
источник
В прошлых проектах на C ++ я успешно использовал PCRE . Он очень полный и хорошо протестирован, поскольку используется во многих громких проектах. И я вижу, что Google также недавно предоставил набор оболочек C ++ для PCRE.
источник
C ++ имеет встроенную библиотеку регулярных выражений начиная с TR1. Библиотека регулярных выражений AFAIK Boost очень совместима с ней и может использоваться в качестве замены, если ваша стандартная библиотека не предоставляет TR1.
источник
Еще два варианта:
Если вы можете написать это на C ++ 11 - просмотрите руководство: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339
Примечание. На момент написания единственной известной мне библиотеки регулярных выражений С ++ 11 была библиотека clang / llvm , которая работает только на Mac. GNU еще не реализует регулярное выражение . Я не знаю о Visual Studio. Большинство людей все еще используют реализацию регулярного выражения Boost .
Или вы можете использовать ragel для создания конечного автомата, который будет выполнять синтаксический анализ за вас, и сгенерировать реализацию кода C / 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 и эта диаграмма конечного автомата:
Обновление 1:
Регулярное выражение libc ++ lvm работает в ubuntu 14.04: libc ++ - dev - Стандартная библиотека LLVM C ++ (файлы для разработки). При компиляции:
clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...
Обновление 2:
В настоящее время мне нравится boost spirit 3 - мне он нравится больше, чем регулярное выражение, потому что он имеет правила стиля BNF и хорошо продуман. (Более старые (более документированные) библиотеки Spirit Qi можно найти здесь )
источник
В Boost есть регулярное выражение .
Это должно заполнить счет
источник
Вы также можете посмотреть библиотеку быстрых регулярных выражений , разработанную в поисковой системе Яндекс для быстрого сопоставления тысяч шаблонов с огромными объемами данных.
источник
Я лично всегда использовал boost.regex (хотя мне не особо нужны регулярные выражения в C ++). В Microsoft Labs также есть библиотека регулярных выражений, называемая GRETA: http://research.microsoft.com/projects/greta/ . Очевидно, это очень быстро и имеет весь синтаксис Perl 5. Я не использовал его, но вы можете попробовать его.
источник
Я столкнулся с аналогичной ситуацией и в итоге использовал движок Henry Spencers Regexp http://www.codeproject.com/KB/string/spencerregexp.aspx
источник
Здесь никто ничего не сказал о том, что идет с C ++ 0x. Если вы используете компилятор и STL, который поддерживает C ++ 0x, вы можете просто использовать его вместо другой библиотеки в своем проекте.
источник