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

107

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

Стефан
источник
20
Если кто-то смотрит на этот старый вопрос в поисках подсказок ... недавно появилась новая библиотека, заслуживающая упоминания: Google RE2: code.google.com/p/re2
Стефан
2
Это оболочка C ++ для новой библиотеки PCRE2 (пересмотренная версия PCRE).
Джахид

Ответы:

80

Boost.Regex очень хорош и должен стать частью стандарта C ++ 0x (он уже в TR1).

Лично мне работать с Boost.Xpressive намного приятнее. Это библиотека, предназначенная только для заголовков, и у нее есть некоторые приятные функции, такие как статические регулярные выражения (регулярные выражения, скомпилированные во время компиляции).

Обновление: если вы используете компилятор, совместимый с C ++ 11 (gcc 4.8 НЕ!), Используйте std :: regex, если у вас нет веских причин использовать что-то еще.

Ферруччо
источник
4
Boost полон ошибок и, похоже, не имеет стандартов кодирования и процесса контроля качества. Это не совсем подходит для производственного программного обеспечения. Это включает в себя механизм Regex, который местами использует C (а не C ++) и включает переполнение буфера из-за небезопасных функций, таких как sprintf. Когда я сообщил о нескольких ошибках после аудита, они остались «непризнанными» через несколько месяцев после отчета. Используйте на свой риск.
jww
8
Почти 5 лет спустя я попытался сегодня использовать std :: regex, но оказалось, что он еще не реализован в GCC. См. Stackoverflow.com/questions/15671536/…
Стефан
2
хорошая причина не использовать std :: regex или boost :: regex в этом отношении может быть то, что boost :: regex примерно в 10 раз медленнее, чем re2
Арсен Захрай
3
@jww Нет, стандарт C ++ (C ++ 03 TR, C ++ 11 и C ++ 1y) решил включить в стандарт несколько расширенных библиотек . Это означает, что для всех практических целей Boost стал стандартом. Создание утверждений без доказательств с использованием ласковых слов, таких как «вероятно», и использование личных атак ничего не меняет того факта, что большая часть boost теперь принадлежит C ++, и многие люди, определяющие современное направление C ++, также работают над boost.
Алиса
3
@Alice - Комитеты C и C ++ создают стандарты. Они не включают библиотеки. Я не знаю, чтобы они когда-либо создавали библиотеку.
jww
22

Спасибо за все предложения.

Сегодня я опробовал несколько вещей, и из того, что мы пытаемся сделать, я выбрал простейшее решение, при котором мне не нужно загружать какую-либо стороннюю библиотеку. В конце я #include <regex.h> и использовал стандартные вызовы POSIX C regcomp () и regexec (). Не C ++, но в крайнем случае это оказалось самым простым.

Стефан
источник
19

В прошлых проектах на C ++ я успешно использовал PCRE . Он очень полный и хорошо протестирован, поскольку используется во многих громких проектах. И я вижу, что Google также недавно предоставил набор оболочек C ++ для PCRE.

Грег Хьюгилл
источник
16

C ++ имеет встроенную библиотеку регулярных выражений начиная с TR1. Библиотека регулярных выражений AFAIK Boost очень совместима с ней и может использоваться в качестве замены, если ваша стандартная библиотека не предоставляет TR1.

Каспрзол
источник
Какой компилятор имеет TR1? Моя копия g ++ 4.1.2 (Debian Etch) не поддерживает #include <regex>, но спасибо за то, что обратил мое внимание на TR1, я забыл. Для других, кому интересно узнать больше о TR1 и C ++ 0x, см. En.wikipedia.org/wiki/Technical_Report_1
Стефан,
Начиная с SP1 Visual Studio 2008 имеет большую часть TR1, включая регулярное выражение. Я знаю, что это не поможет вам в Linux, но другим может быть интересно. Dinkumware также поддерживает TR1 на gcc.
Майкл Бёрр
Как я уже писал, если в вашей библиотеке std нет регулярного выражения, вы можете использовать boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol
3
g ++ 4.5.0. TR1 живет в tr1 / regex. например: #include <tr1 / regex>
Ogre Psalm33
11

Еще два варианта:

Если вы можете написать это на 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 можно найти здесь )

матиу
источник
6

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

Roel
источник
8
GRETA ( research.microsoft.com/en-us/downloads/… ) была создана Эриком Ниблером, когда он работал в Microsoft (1998-2001 гг. Из файлов заголовков GRETA). Эрик Ниблер тогда сделал в 2007 году Boost.Xpressive. Люди должны использовать Boost.Xpressive, потому что он новее и имеет лучшую лицензию, чем «Лицензионное соглашение с конечным пользователем Microsoft Research»
Кристиан Адам
1
Извините, я не понимаю, насколько хорошо использовать библиотеку Boost. В последний раз я проверял локальную загрузку несжатой версии boost - 400 мегабайт. Не говоря уже о безумие шаблонов, которое вы получаете с boost. Извините, рекомендую Грегсу ответить.
Чад
@Chad Потому что boost - это хорошо известный и хорошо зарекомендовавший себя набор стандартных библиотек, которые полезны во многих ситуациях? Если размер загрузки для вас слишком велик, просто используйте BCD, чтобы удалить все, что вам не нужно; boost.regex при таком разделении будет довольно маленьким.
Алиса
1

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

RedX
источник
1
Если вы посмотрите на ответ, получивший наибольшее количество голосов (от 2+ лет назад), он упоминает это.
Mateen Ulhaq