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?
cevap
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.
+ 1'i deneyin ve bunun gibi cevaplarla 308'den fazla rep sahibi olmalısınız! –
* 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: –
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.
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
- 1. Çoklu dize değiştirmeleri (aynı dize içinde)
- 2. Javascript normal ifadesi - RegEx nesnesine dize
- 3. Normal İfadeler (RegEx) - Bir Dize Değişken uzunluğu
- 4. C# normal ifade,
- 5. C dilinde
- 6. java regex bölünmüş dize
- 7. Objective-C'de Regex nasıl yapılır
- 8. Yay denetleyicide normal regex
- 9. Dize enterpolasyonu nasıl yapılır?
- 10. C dilinde nasıl alt yazı alabilirim? Örneğin
- 11. Geçerli normal ifadeyle eşleşen Regex
- 12. D dilinde dize bir char * nasıl yazılır?
- 13. D dilinde C++ (C) çağrısı
- 14. Dize için regex içerir?
- 15. C# aşağıdaki RegEx çok yavaş büyük dize
- 16. Regex bölünmüş dize koruma tırnakları
- 17. Python'da regex kullanarak dize ayırma
- 18. isteğe bağlı normal regex lookahead
- 19. URL C için Normal İfade #
- 20. Regex dize ekleme
- 21. ptrdiff_t, C dilinde nerede tanımlanır?
- 22. C dilinde dosya uzantısı alma
- 23. Boşluklu dize için bir Regex nasıl oluşturulur
- 24. C dilinde seri programlama, DOS
- 25. c dilinde ayrı çıkış verisi
- 26. C dilinde rollDice() işlevini nasıl uygulamalıyım?
- 27. C# dilinde özel "textChanged" işlevi nasıl yazılır?
- 28. C dilinde adlandırılmış yöneltmeler için izleme C#
- 29. Regex Java Dize
- 30. Normal ifade sınırı dize boyutu
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
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? –
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