С++: какую библиотеку регулярных выражений следует использовать? - программирование
Подтвердить что ты не робот

С++: какую библиотеку регулярных выражений следует использовать?

Я работаю над коммерческим (не открытым исходным кодом) проектом С++, который работает на основе 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, поэтому не может использоваться в этом проекте)

4b9b3361

Ответ 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 в нем.

Это должно заполнить счет

Ответ 8

Я лично всегда использовал boost.regex(хотя у меня нет необходимости в регулярном выражении на С++). Microsoft Labs также имеет библиотеку регулярных выражений, называемую GRETA: http://research.microsoft.com/projects/greta/. По-видимому, это очень быстро и имеет целый синтаксис Perl 5. Я не использовал его, но вы можете проверить его.

Ответ 10

Никто здесь ничего не сказал о том, что поставляется с С++ 0x. Если вы используете компилятор и STL, который поддерживает С++ 0x, вы можете просто использовать это вместо наличия другой библиотеки в вашем проекте.