2016-03-30 10 views
1

bulmak :: dize için düzenli ifade eşdeğeri. Ben tam bir C++ noob'um (hiç bir şey yazmadım) bu yüzden birisinin beni işe yarayacak bir işleve yönlendirebileceğini umuyorum. Aşağıdaki kodu alın:C++ Ben girdi en birinin yerine bir dize bir regexp'in dizesini kabul etmesi için basit bir ayar yapmak için bir açık kaynak C++ programı düzenlemek çalışıyorum

#include <iostream> 
#include <string> 

int main() { 
    std::string str1("ABCDEABCABD"); 
    std::string pattern("A"); 

    int count1 = 0; 

    size_t p1 = str1.find(pattern, 0); 
    while(p1 != std::string::npos) 
    { 
     p1 = str1.find(pattern,p1+pattern.size()); 
     count1 += 1; 
    } 

    std::cout << count1 << std::endl; 
} 

Ben boru işareti ile ayrılan birçok desen normal bir ifade kabul etmek için 'desen', örneğin 'A | D' istiyoruz (olur bu durumda çıkış 5). Ben this C++ reference page toplamak ne, sen fonksiyonunu bulmak :: dizesine böyle bir normal ifade tedarik edemez itibaren

. Bunun yerine buraya hangi işlevi koyabilirim?

Teşekkürler!

#include <iostream> 
#include <regex> 
using namespace std; 

int main() { 
    std::string pattern("A|D");   // Regex expression 
    std::regex rx(pattern);    // Getting the regex object 

    std::string s("ABCDEABCABD");  // Defining the string input 
    std::ptrdiff_t number_of_matches = std::distance( // Count the number of matches inside the iterator 
     std::sregex_iterator(s.begin(), s.end(), rx), 
     std::sregex_iterator()); 

    std::cout << number_of_matches << std::endl; // Displaying results 
    return 0; 
} 

IDEONE demo

notuna bakın o:

+0

Kullanım 'std :: regex_search'. Giriş dizesinde bulunan birden çok eşleşmeyi döndüren kodu gösteren gönderiye bağ yapıyorum. Bunu uygulamakta herhangi bir sorun yaşıyorsanız, yorum bırakmaya çekinmeyin. –

+0

Üzgünüm C++ 'yı daha önce hiç kullanmamıştım, bu yüzden burada gerçekten zor bir zaman geçiriyorum. Görüyorum ki bu işlev std :: regex türünde bir nesneyi alır? Ancak, model nesnesi, işlev tanımında bu 'std :: string pattern' gibi bir tür dizgi olarak sağlanır. Ayrıca p1 = std :: string :: npos kullanarak da kullanabilir miyim? P. Ayrıca başka bir soru dizge :: find? – Floris

+0

Amacınız nedir? Tam olarak neye ihtiyacınız var? Şu anda, belirli bir regex deseniyle eşleşen bir dizede tüm alt dizeleri bulacak ve satacak bir kod parçası soruyorsunuz. Bağlantı kurduğum yazı nasıl yapılacağını gösterir ('std :: sregex_iterator' çözümü en iyi IMHO'dur). Başka? ** 'string :: find' regex ** 'i desteklemiyor, bu yüzden bağlandığım post geçerli bir dupe kaynağı. –

cevap

1

Aşağıdaki C++ kodu kaldıraç olabilir

  • desen onlar kaçan gerekebilir özel karakterler ile edebi dizeleri içerebilir edin.
  • std::distance
  • first ve last arasında elemanların sayısı, elementlerin yineleyici verimleri sayısını verir bir fonksiyonudur.
+0

Çok teşekkür ederim :) – Floris

İlgili konular