C ++: perpustakaan regex apa yang harus saya gunakan? [Tutup]

107

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)

Stéphane
sumber
20
Jika ada yang melihat pertanyaan lama ini untuk mencari petunjuk ... perpustakaan baru telah muncul baru-baru ini yang pantas untuk disebutkan: Google RE2: code.google.com/p/re2
Stéphane
2
Ini adalah pembungkus c ++ untuk pustaka PCRE2 (versi revisi PCRE) baru.
Jahid

Jawaban:

80

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.

Ferruccio
sumber
4
Boost penuh dengan bug dan tampaknya tidak memiliki standar pengkodean dan proses QA. Ini tidak terlalu cocok untuk perangkat lunak produksi. Itu termasuk gear Regex-nya, yang menggunakan C (bukan C ++) di beberapa tempat dan termasuk buffer overflows karena fungsi yang tidak aman seperti sprintf. Ketika saya melaporkan banyak bug setelah audit, mereka tetap "tidak diketahui" berbulan-bulan setelah laporan. Gunakan dengan resiko Anda sendiri.
jww
8
Hampir 5 tahun kemudian, saya mencoba hari ini untuk menggunakan std :: regex, tetapi ternyata belum diterapkan di GCC. Lihat stackoverflow.com/questions/15671536/…
Stéphane
2
Alasan yang bagus untuk tidak menggunakan std :: regex atau boost :: regex dalam hal ini adalah boost :: regex, sekitar 10 kali lebih lambat dari re2
Arsen Zahray
3
@jww Tidak, standar C ++ (C ++ 03 TR, C ++ 11 dan C ++ 1y) telah memutuskan untuk menggabungkan beberapa pustaka pendorong ke dalam standar . Itu berarti, untuk semua tujuan praktis, Boost menjadi standar. Membuat pernyataan tanpa bukti menggunakan kata-kata musang seperti "mungkin" dan menggunakan serangan pribadi tidak mengubah fakta bahwa sebagian besar dorongan sekarang adalah C ++, dan banyak orang yang menentukan arah modern C ++ juga sedang mengerjakan pendorong.
Alice
3
@Alice - Komite C dan C ++ membuat standar. Mereka tidak termasuk perpustakaan. Saya tidak tahu mereka pernah membuat perpustakaan.
jww
22

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.

Stéphane
sumber
19

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.

Greg Hewgill
sumber
16

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.

Kasprzol
sumber
Kompiler apa yang memiliki TR1? Salinan g ++ 4.1.2 (Debian Etch) saya tidak mendukung #include <regex> tetapi terima kasih telah menyampaikan TR1 kepada saya, saya lupa. Bagi orang lain yang ingin tahu lebih banyak tentang TR1 dan C ++ 0x, lihat en.wikipedia.org/wiki/Technical_Report_1
Stéphane
Pada SP1 Visual Studio 2008 memiliki sebagian besar TR1, termasuk regex. Saya tahu ini tidak membantu Anda di Linux, tetapi orang lain mungkin tertarik. Dinkumware juga mendukung TR1 di gcc.
Michael Burr
Seperti yang saya tulis, jika perpustakaan std Anda tidak memiliki regex, maka Anda dapat menggunakan boost: boost.org/doc/libs/1_36_0/doc/html/boost_tr1/…
Kasprzol
3
g ++ 4.5.0. TR1 tinggal di tr1 / regex. misalnya: #include <tr1 / regex>
Ogre Mazmur33
11

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:

diagram negara


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 )

matiu
sumber
7

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.

Alexander Gololobov
sumber
6

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.

Roel
sumber
8
GRETA ( research.microsoft.com/en-us/downloads/… ) dibuat oleh Eric Niebler ketika dia bekerja di Microsoft (1998-2001 dari file header GRETA). Eric Niebler kemudian membuat Boost.Xpressive pada tahun 2007. Orang-orang harus menggunakan Boost.Xpressive karena lebih baru dan memiliki lisensi yang lebih bagus daripada "perjanjian lisensi pengguna akhir Microsoft Research"
Cristian Adam
1
Maaf, saya tidak melihat betapa menarik perpustakaan Boost itu hal yang baik. Terakhir kali saya memeriksa peningkatan versi tidak terkompresi unduhan lokal adalah 400 MB. Belum lagi kegilaan template sia-sia yang Anda dapatkan dengan peningkatan. Maaf, saya merekomendasikan jawaban Greg.
Chad
@Chad Karena boost adalah kumpulan pustaka standar yang terkenal dan dihormati yang berguna dalam banyak situasi? Jika ukuran unduhan terlalu besar untuk Anda, cukup gunakan BCD untuk menghapus apa pun yang tidak Anda perlukan; boost.regex cukup kecil jika dihilangkan dengan cara ini.
Alice
1

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.

RedX
sumber
1
Jika Anda melihat jawaban dengan suara terbanyak (dari 2+ tahun lalu), ini menyebutkan ini.
Mateen Ulhaq