Saya sedang mengerjakan proyek C ++ komersial (bukan open source) yang berjalan pada sistem berbasis linux. Saya perlu melakukan beberapa regex dalam kode C ++. (Saya tahu: Saya sekarang memiliki 2 masalah.)
PERTANYAAN: Perpustakaan apa yang direkomendasikan oleh orang-orang yang secara teratur menggunakan regex dari C / C ++? Pencarian cepat telah menarik perhatian saya:
1) Boost.Regex (Saya perlu membaca Boost Software License, tetapi pertanyaan ini bukan tentang lisensi perangkat lunak)
2) C (bukan C ++) POSIX regex (#include <regex.h>, regcomp, regexec, dll.)
3) http://freshmeat.net/projects/cpp_regex/ (Saya tidak tahu apa-apa tentang yang ini; sepertinya GPL, oleh karena itu tidak dapat digunakan pada proyek ini)
Jawaban:
Boost.Regex sangat bagus dan dijadwalkan untuk menjadi bagian dari standar C ++ 0x (sudah ada di TR1).
Secara pribadi, saya menemukan Boost.Xpressive jauh lebih baik untuk dikerjakan. Ini adalah perpustakaan khusus header dan memiliki beberapa fitur bagus seperti ekspresi reguler (regex dikompilasi pada waktu kompilasi).
Pembaruan: Jika Anda menggunakan kompiler yang mendukung C ++ 11 (gcc 4.8 TIDAK!), Gunakan std :: regex kecuali Anda memiliki alasan kuat untuk menggunakan yang lain.
sumber
Terima kasih atas semua sarannya.
Saya mencoba beberapa hal hari ini, dan dengan hal-hal yang kami coba lakukan, saya memilih solusi paling sederhana di mana saya tidak perlu mengunduh pustaka pihak ketiga lainnya. Pada akhirnya, saya #include <regex.h> dan menggunakan panggilan C POSIX standar regcomp () dan regexec (). Bukan C ++, tetapi dalam keadaan darurat ini terbukti yang paling mudah.
sumber
Dalam proyek C ++ sebelumnya, saya telah menggunakan PCRE dengan sukses. Ini sangat lengkap dan teruji dengan baik karena digunakan di banyak proyek profil tinggi. Dan saya melihat bahwa Google telah menyumbangkan satu set pembungkus C ++ untuk PCRE baru-baru ini juga.
sumber
C ++ memiliki pustaka regex bawaan sejak TR1. Library regex AFAIK Boost sangat kompatibel dengannya dan dapat digunakan sebagai pengganti, jika library standar Anda tidak menyediakan TR1.
sumber
Dua opsi lagi:
Jika Anda dapat menulisnya di c ++ 11 - Lakukan tutorial: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339
Catatan: Pada saat penulisan, satu-satunya pustaka regex c ++ 11 yang saya tahu berfungsi adalah yang clang / llvm , dan hanya berfungsi di Mac. GNU masih belum mengimplementasikan regex . Saya tidak tahu tentang Visual Studio. Kebanyakan orang masih menggunakan implementasi boost regex .
Atau Anda dapat menggunakan ragel untuk menghasilkan mesin status terbatas untuk melakukan parsing untuk Anda, dan menghasilkan implementasi kode C / C ++: http://www.complang.org/ragel/
Saya menggunakannya sedikit untuk menghasilkan kode untuk mengurai json. File ragel ini: https://github.com/matiu2/yajp/blob/master/parser/number.rl digunakan untuk menghasilkan kode ini https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 dan diagram mesin kondisi hingga ini:
Pembaruan 1:
libc ++ regex lvm berfungsi di ubuntu 14.04: libc ++ - dev - LLVM C ++ Standard library (file pengembangan). Saat menyusun:
clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...
Perbarui 2:
Saat ini saya menikmati dorongan semangat 3 - Saya lebih menyukainya daripada regex, karena memiliki aturan gaya BNF dan dipikirkan dengan baik. (Lebih tua (lebih terdokumentasi) libs Spirit Qi ditemukan di sini )
sumber
Boost memiliki regex di dalamnya.
Itu harus memenuhi tagihan
sumber
Anda juga dapat melihat perpustakaan regex cepat yang dikembangkan di mesin pencari Yandex untuk melakukan pencocokan cepat dari ribuan pola dengan data dalam jumlah besar.
sumber
Saya pribadi selalu menggunakan boost.regex (meskipun saya tidak terlalu membutuhkan regex di C ++). Microsoft Labs juga memiliki perpustakaan regex, yang disebut GRETA: http://research.microsoft.com/projects/greta/ . Rupanya itu sangat cepat dan menampilkan seluruh sintaks Perl 5. Saya belum pernah menggunakannya, tetapi Anda mungkin ingin mengujinya.
sumber
Saya menghadapi situasi yang sama dan akhirnya menggunakan Henry Spencers Regexp Engine http://www.codeproject.com/KB/string/spencerregexp.aspx
sumber
Tidak ada orang di sini yang mengatakan apa-apa tentang yang datang dengan C ++ 0x. Jika Anda menggunakan kompiler dan STL yang mendukung C ++ 0x, Anda bisa menggunakannya daripada memiliki lib lain dalam proyek Anda.
sumber