C ++: яку бібліотеку регулярних виразів я повинен використовувати? [зачинено]


107

Я працюю над комерційним (не з відкритим кодом) проектом C ++, який працює на базі системи Linux. Мені потрібно виконати деякий регулярний вираз в коді C ++. (Я знаю: у мене зараз 2 проблеми.)

ЗАПИТАННЯ: Які бібліотеки рекомендують людям, які регулярно виконують регулярні вирази з C / C ++? Швидкий пошук привернув мені до уваги наступне:

1) Boost.Regex (мені потрібно прочитати ліцензію на програмне забезпечення Boost, але це питання не стосується ліцензій на програмне забезпечення)

2) C (не C ++) POSIX regex (#include <regex.h>, regcomp, regexec тощо)

3) http://freshmeat.net/projects/cpp_regex/ (я нічого не знаю про це; здається, GPL, тому не підходить для цього проекту)


20
У випадку, якщо хтось дивиться на це старе питання для підказки ... нещодавно з’явилася нова бібліотека, яку заслуговує на згадку: Google RE2: code.google.com/p/re2
Stéphane

2
Це обгортка c ++ для нової бібліотеки PCRE2 (переглянута версія PCRE).
Джахід

Відповіді:


80

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

Особисто мені здається, що Boost.Xpressive набагато приємніше працювати. Це бібліотека, лише для заголовка, і має деякі приємні особливості, такі як статичні регулярні вирази (регулярні регекси, зібрані під час компіляції).

Оновлення: Якщо ви використовуєте компілятор, сумісний із C ++ 11 (gcc 4.8 НЕ!), Використовуйте std :: regex, якщо у вас немає вагомих причин використовувати щось інше.


4
Підвищення повне помилок і, здається, не вистачає стандартів кодування та процесу забезпечення якості. Його не дуже підходить для виробництва програмного забезпечення. Це включає в себе передачу Regex, яка використовує місцями C (а не C ++) і включає переповнення буфера через небезпечні функції, такі як sprintf. Коли я повідомив про купу помилок після аудиту, вони залишалися "невпізнаними" місяцями після звіту. Використовуйте на свій страх і ризик.
jww

8
Майже через 5 років я сьогодні спробував використовувати std :: regex, але виявляється, він ще не був реалізований у GCC. Дивіться stackoverflow.com/questions/15671536/…
Stéphane

2
тому вагомою причиною не використовувати std :: regex або boost :: regex для цього питання буде те, що boost :: regex, приблизно в 10 разів повільніше, ніж re2
Arsen Zahray

3
@jww Ні, стандарт C ++ (C ++ 03 TR, C ++ 11 і C ++ 1y) вирішив включити до стандарту декілька прискорених бібліотек . Це означає, що для всіх практичних цілей Boost зробив стандарт. Ствердження без доказів, використовуючи слова «напевно» та особисті напади, нічого не змінить той факт, що велика частина поштовху зараз є C ++, і багато людей, що визначають сучасний напрямок C ++, також працюють над цим.
Аліса

3
@Alice - Комітети C і C ++ створюють стандарти. Вони не містять бібліотек. Мені невідомо, що вони коли-небудь створюють бібліотеку.
jww

22

Дякую за всі пропозиції.

Сьогодні я спробував декілька речей, і з речей, які ми намагаємося зробити, я вибрав найпростіше рішення, де мені не потрібно завантажувати будь-яку іншу сторонній бібліотеку. Зрештою, я #include <regex.h> і використовував стандартні C POSIX виклики 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
Stéphane

Станом на SP1 Visual Studio 2008 має більшу частину TR1, включаючи регекс. Я знаю, що це не допомагає тобі в Linux, але інші можуть бути зацікавлені. Dinkumware також підтримує TR1 для gcc.
Майкл Берр

Як я писав, якщо у вашій бібліотеці std немає регулярного вираження, ви можете використовувати boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol

3
г ++ 4,5,0. TR1 живе в tr1 / regex. наприклад: #include <tr1 / regex>
Огрійський псалом33,

11

Ще два варіанти:

Якщо ви можете написати це в c ++ 11 - Виконайте підручник: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Примітка. На момент написання єдиної бібліотеки cge + regex, яка, як я знаю, працює, це clang / llvm та працює лише на Mac. GNU все ще не реалізує регулярний вираз . Я не знаю про Visual Studio. Більшість людей досі використовують реалізацію підсилювальних регексів .


Або ви можете використовувати 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:

Регікс lvm libc ++ працює на ubuntu 14.04: libc ++ - dev - стандартна бібліотека LLVM C ++ (файли розробки). При складанні:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Оновлення 2:

В даний час я насолоджуюся стилем підсилення 3 - мені це подобається більше, ніж регулярний вираз, тому що він має правила стилю BNF і добре продуманий. ( Тут знайдені старіші (більш задокументовані) губи Spirit Qi )




6

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


8
GRETA ( research.microsoft.com/en-us/downloads/… ) був зроблений Еріком Ніблером, коли він працював у Microsoft (1998-2001 рр. Із файлів заголовків GRETA). Ерік Ніблер тоді зробив у 2007 Boost.Xpressive. Люди повинні використовувати Boost.Xpressive, оскільки він новіший і має кращу ліцензію, ніж "Ліцензійний договір кінцевого користувача Microsoft Research"
Крістіан Адам,

1
Вибачте, я не бачу, як корисна річ у бібліотеці Boost. Востаннє я перевіряв локальну завантажену нестиснену версію підсилення - 400 мег. Не кажучи вже про безумство шаленого шаблону, яке ви отримуєте з підвищенням. Вибачте, рекомендую відповідь Грегса.
Чад


@Chad Тому, що boost - це добре відомий і добре оцінений набір стандартних бібліотек, які корисні у багатьох ситуаціях? Якщо розмір завантаження занадто великий для вас, просто використовуйте BCD, щоб зняти все, що вам не потрібно; boost.regex зовсім невеликий, коли його знімають таким чином.
Аліса


1

Ніхто тут нічого не сказав про той, що поставляється із C ++ 0x. Якщо ви використовуєте компілятор та STL, що підтримує C ++ 0x, ви можете просто використовувати його замість того, щоб мати інший lib у своєму проекті.


1
Якщо ви подивитесь на відповідь з найбільш високим голосом (від 2+ років тому), це згадується.
Mateen Ulhaq
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.