C ++: Hangi regex kitaplığını kullanmalıyım? [kapalı]


107

Linux tabanlı bir sistemde çalışan ticari (açık kaynaklı olmayan) bir C ++ projesi üzerinde çalışıyorum. C ++ kodu içinde bazı normal ifadeler yapmam gerekiyor. (Biliyorum: Şimdi 2 sorunum var.)

SORU: Düzenli olarak C / C ++ 'dan regex yapan kişiler hangi kitaplıklara bakmamı önerir? Hızlı bir arama aşağıdakileri dikkatime çekti:

1) Boost.Regex (Boost Yazılım Lisansını okumam gerekiyor, ancak bu soru yazılım lisanslarıyla ilgili değil)

2) C (C ++ değil) POSIX normal ifadesi (#include <regex.h>, regcomp, regexec vb.)

3) http://freshmeat.net/projects/cpp_regex/ (Bununla ilgili hiçbir şey bilmiyorum; GPL gibi görünüyor, bu nedenle bu projede kullanılamaz)


20
Birinin ipuçları için bu eski soruya bakması durumunda ... Son zamanlarda bahsedilmeyi hak eden yeni bir kitaplık ortaya çıktı: Google'ın RE2: code.google.com/p/re2
Stéphane

2
Bu , yeni PCRE2 (PCRE'nin revize edilmiş sürümü) kitaplığı için bir c ++ sarıcıdır.
Cahid

Yanıtlar:


80

Boost.Regex çok iyi ve C ++ 0x standardının bir parçası olması planlanıyor (zaten TR1'de).

Şahsen ben Boost.Xpressive ile çalışmayı çok daha güzel buluyorum . Yalnızca başlık içeren bir kitaplıktır ve statik regexes (derleme zamanında derlenen regexes) gibi bazı güzel özelliklere sahiptir.

Güncelleme: C ++ 11 uyumlu bir derleyici kullanıyorsanız (gcc 4.8 DEĞİLDİR!), Başka bir şey kullanmak için iyi bir nedeniniz yoksa std :: regex kullanın.


4
Boost, hatalarla dolu ve bir kodlama standartları ve kalite güvence sürecinden yoksun görünüyor. Üretim yazılımları için pek uygun değil. Bu, yerlerde C (C ++ yerine) kullanan ve sprintf gibi güvenli olmayan işlevler nedeniyle arabellek taşmaları içeren Regex donanımını içerir. Bir denetimden sonra bir grup hata bildirdiğimde, rapordan aylar sonra "onaylanmamış" kaldılar. Kendi sorumluluğunuzdadır kullanın.
jww

8
Neredeyse 5 yıl sonra, bugün std :: regex'i kullanmayı denedim, ancak henüz GCC'de uygulanmadığı ortaya çıktı. Stackoverflow.com/questions/15671536/… sayfasına
Stéphane

2
Bu konuda std :: regex veya boost :: regex kullanmamanın iyi bir nedeni, boost ::
regex'in re2'den

3
@jww Hayır, C ++ standardı (C ++ 03 TR, C ++ 11 ve C ++ 1y), standarda birkaç yükseltme kitaplığı eklemeye karar verdi . Bu, tüm pratik amaçlar için, Boost'un standardı yaptığı anlamına gelir . "Muhtemelen" gibi gelincik kelimeleri kullanarak kanıt olmadan iddialarda bulunmak ve kişisel saldırılar kullanmak, güçlendirmenin büyük bölümlerinin artık C ++ olduğu gerçeğini değiştirmez ve C ++ 'nın modern yönünü tanımlayan birçok kişi de destek üzerinde çalışıyor.
Alice

3
@Alice - C ve C ++ komiteleri standartlar oluşturur. Kütüphane içermiyorlar. Bir kütüphane ürettiklerinin farkında değilim.
jww

22

Tüm önerileriniz için teşekkürler.

Bugün birkaç şey denedim ve yapmaya çalıştığımız şeylerle, başka herhangi bir üçüncü taraf kitaplığı indirmek zorunda olmadığım en basit çözümü seçtim. Sonunda, ben #include <regex.h> ve standart C POSIX çağrılarını regcomp () ve regexec () kullandım. C ++ değil, ancak bir tutamda bu en kolayı oldu.


19

Geçmiş C ++ projelerinde PCRE'yi başarılı bir şekilde kullandım. Pek çok yüksek profilli projede kullanıldığı için çok eksiksiz ve iyi test edilmiştir. Ve Google'ın son zamanlarda PCRE için bir dizi C ++ sarmalayıcıya katkıda bulunduğunu görüyorum.


16

C ++, TR1'den beri yerleşik bir düzenli ifade kitaplığına sahiptir. AFAIK Boost'un regex kitaplığı onunla çok uyumludur ve standart kitaplığınız TR1 sağlamıyorsa yedek olarak kullanılabilir.


Hangi derleyicide TR1 var? G ++ 4.1.2 (Debian Etch) kopyamda #include <regex> desteği yok ama TR1'i dikkatime çektiğiniz için teşekkürler, unutmuştum. TR1 ve C ++ 0x hakkında daha fazla bilgi edinmek isteyenler için bkz. En.wikipedia.org/wiki/Technical_Report_1
Stéphane

SP1 itibarıyla Visual Studio 2008, normal ifade dahil olmak üzere TR1'in çoğuna sahiptir. Linux'ta size yardımcı olmadığını biliyorum, ancak diğerleri ilgilenebilir. Dinkumware, gcc'de TR1'i de destekler.
Michael Burr


3
g ++ 4.5.0. TR1, tr1 / regex'te yaşar. örneğin: #include <tr1 / regex>
Ogre Mezmur33

11

İki seçenek daha:

Eğer c ++ 11'de yazabiliyorsanız - Öğreticiyi yapın: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15339

Not: Yazarken çalıştığını bildiğim tek c ++ 11 regex kitaplığı clang / llvm'dir ve yalnızca Mac'te çalışır. GNU henüz regex'i uygulamıyor . Visual Studio hakkında bilgim yok. Çoğu kişi hala kullanmak artırmak regex uygulaması.


Veya sizin için ayrıştırmayı yapmak üzere bir sonlu durum makinesi oluşturmak için ragel'i kullanabilir ve C / C ++ kod uygulamasını oluşturabilirsiniz: http://www.complang.org/ragel/

Bunu json ayrıştırmak için kod üretmek için biraz kullandım. Bu ragel dosyası: https://github.com/matiu2/yajp/blob/master/parser/number.rl bu kodu oluşturmak için kullanılır https://github.com/matiu2/yajp/blob/master/parser/json .hpp # L254 ve bu sonlu durum makinesi diyagramı:

durum diyagramı


Güncelleme 1:

lvm'nin libc ++ regex'i ubuntu 14.04'te çalışır: libc ++ - dev - LLVM C ++ Standart kitaplığı (geliştirme dosyaları). Derlerken:clang++ -std=c++11 -lc++ -I/usr/include/c++/v1 ...

Güncelleme 2:

Şu anda boost spirit 3'ten keyif alıyorum - regex'ten daha çok seviyorum çünkü BNF stil kuralları var ve iyi düşünülmüş. (Daha eski (daha fazla belgelenmiş) Spirit Qi kitaplıkları burada bulundu )




6

Kişisel olarak her zaman boost.regex kullandım (C ++ 'da regex'e pek ihtiyacım olmasa da). Microsoft Labs, GRETA adında bir normal ifade kitaplığına da sahiptir: http://research.microsoft.com/projects/greta/ . Görünüşe göre çok hızlı ve tam bir Perl 5 sözdizimi içeriyor. Kullanmadım ama test etmek isteyebilirsin.


8
GRETA ( research.microsoft.com/en-us/downloads/… ), Eric Niebler tarafından Microsoft'ta çalışırken (GRETA'nın başlık dosyalarından 1998-2001) yapıldı. Eric Niebler daha sonra 2007'de Boost.Xpressive yaptı. İnsanlar Boost.Xpressive'ı kullanmalı çünkü daha yeni ve "Microsoft Research son kullanıcı lisans sözleşmesi" nden daha güzel bir lisansa sahip
Cristian Adam

1
Maalesef Boost kitaplığını içeri çekmenin ne kadar iyi bir şey olduğunu anlamıyorum. Yerel indirilen sıkıştırılmamış destek sürümünü en son kontrol ettiğimde 400 megs. Takviye ile elde ettiğiniz inain şablon çılgınlığından bahsetmeye bile gerek yok. Üzgünüm, Gregs cevabını öneririm.
Chad


@Chad Çünkü boost, birçok durumda yardımcı olan, iyi bilinen ve saygın bir standart kitaplık kümesidir? İndirme boyutu sizin için çok büyükse, ihtiyacınız olmayan her şeyi çıkarmak için BCD'yi kullanın; boost.regex bu şekilde soyulduğunda oldukça küçüktür.
Alice


1

Burada kimse C ++ 0x ile gelen hakkında bir şey söylemedi. Bir derleyici ve C ++ 0x'i destekleyen STL kullanıyorsanız, projenizde başka bir kütüphaneye sahip olmak yerine bunu kullanabilirsiniz.


1
En yüksek oyu alan cevaba (2+ yıl öncesinden) bakarsanız, bundan bahsediyor.
Mateen Ulhaq
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.