2011-11-07 20 views
12

POSIX regex kitaplığı ve PCRE kitaplığındaki regex işlevlerine baktım, ancak bunların her ikisi de bir dize değiştirme işlevi görmüyor. C++ kullanmak istemiyorum ve eğer başka bir kütüphaneye bağlanması gerekmiyorsa en iyisi olurdu (ancak yapmam gerekirse yapabilirim). Dize değiştirmeyi elle yapmam gerekir mi? Öyleyse, yakalama gruplarını nasıl kullanabilirim?Normal C dilinde regex dize değiştirmeleri nasıl yapılır?

+0

Hangi yakalama gruplarını kullanıyorsunuz? Regex için yerleşik C kütüphanesi yok, pcre veya bunun gibi bir şey kullanmak zorunda kalacaksınız. – lvella

+0

Genel olarak C dizesinin içinde dize değiştirmeleri yapamazsınız - kullanılabilir belleğe sahip olmayabilirsiniz. Tam olarak ne yapmaya çalıştığını açıklayabilir misin? –

+0

Yani benim özel olmamı mı istiyorsun? Değiştirmek ve sunucuya iletmek için düzenli ifadeyi kullanmak istediğim bir HTTP isteği üstbilgisi var. – Yifan

cevap

20

regex.h, dizgi değiştirme için yerel destek sağlamaz, ancak daha kolay hale getiren alt ifadeler/yakalama grupları sağlar. Regex derlemelerine aşina olduğunuzu ve regex yürütme ve alt ifadelere atladığınızı varsayacağım. regex.h aşağıdaki gibi

regexec() tanımlanmıştır (/ usr// dahil), ikinci ve son tartışmalar normal ifade olan

extern int regexec (const regex_t *__restrict __preg, 
     const char *__restrict __string, size_t __nmatch, 
     regmatch_t __pmatch[__restrict_arr], 
     int __eflags); 

ilk dize ve yürütme bayrakları yürütülecek , sırasıyla. Üçüncü ve dördüncü argümanlar, regmatch_t'in bir dizisini belirtmek için kullanılır. Bir regmatch_t iki alandan oluşur: rm_so ve rm_eo, sırasıyla eşleşen alanın başlangıcına ve sonuna ait indis veya ofsetlerdir. Tez indeksleri daha sonra string değiştirme işlemini gerçekleştirmek için string.h'den memcpy(), memset() ve memmove() ile birlikte kullanılabilir.

Biraz örnek yapacağız ve daha sonra göndereceğim.

İyi şanslar, umarım bu yardımcı olur.

+0

+ 1'i deneyin ve bunun gibi cevaplarla 308'den fazla rep sahibi olmalısınız! –

+4

* Biraz örnek vereceğim ve daha sonra göndereceğim. * Ne zaman? Bu sözü 5 yıl önce yaptın. ([Buradayız] (http://stackoverflow.com/questions/1085083/regular-expressions-in-c-examples) Şimdiye kadar bulmuş olduğum birkaç örnek: –

5

PCRE kitaplığının kendisi bir değiştirme işlevi sağlamaz, ancak PCL yüklemeleri sayfasında, perl stili =~ s/pattern/replace/ sözdizimini kabul eden bir sarıcı işlevi vardır ve ardından PCRE yerel işlevlerini sizin için bir ikame/değiştirme yapmak üzere kullanır. http://www.pcre.org/'a gidin ve ardından İndirme bağlantısına tıklayın: ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/, daha sonra Contrib dizini. İstediğiniz paket/proje: pcrs-0.0.3-src.tar.gz.

Bunu kendim kullanmadığımı not edin, böylece ne kadar iyi çalıştığını ifade edemem. Ancak, oldukça küçük ve basit bir kod parçasıdır, bu nedenle amacınıza iyi bir şekilde hizmet edebilir.

+0

Merhaba, bağlantı için teşekkürler. Programımda pcrs kullanıyorum? Şu anda burada pcre_compile ve pcre_exec işlevlerini kullanıyorum http://stackoverflow.com/a/1421923/1729501 – user13107