2011-11-27 28 views
9

C++ 11'ler std::regex kullanarak kibrit sayısını nasıl sayarım? Sayım sayıları

std::regex re("[^\\s]+"); 
std::cout << re.matches("Harry Botter - The robot who lived.").count() << std::endl; 

Beklenen çıkışı:

7

+2

Ve çıkış –

+0

@EdHeal ben [derleme hatası] olsun .... ise (http://ideone.com/uxyrV): hata: 'regex_count' bu kapsamda açıklanmadı '. ;) –

cevap

15

Onları saymak için distance kullanmak sonra, tüm maçlarında oluşturmak için regex_iterator kullanabilirsiniz:

std::regex const expression("[^\\s]+"); 
std::string const text("Harry Botter - The robot who lived."); 

std::ptrdiff_t const match_count(std::distance(
    std::sregex_iterator(text.begin(), text.end(), expression), 
    std::sregex_iterator())); 

std::cout << match_count << std::endl; 
+0

"std :: sregex_iterator" ifadesinin neyi döndürdüğünü ve iki yöntem arasındaki 'mesafeyi' açıklayabilir misiniz? –

+1

@muntoo: 'sregex_iterator', metindeki tüm eşleşmeleri yineleyen 'regex_iterator' üzerinden yazılmış bir yazımdır. 'distance' bir yineleyici aralığındaki elemanların sayısını hesaplayan Standart Kütüphane fonksiyonudur (bu durumda, tüm eşleşmeleri okur ve kaç tane olduğunu döndürür). –

+0

Merhaba. Bu eski bir iş parçacığı olsa bile: (w) sregex :: yineleyici, eşleştirdiğiniz gibi, eşleşme sırasında match_count işlemini (C++ 11'de zaten mevcut değil) bırakabilirsiniz. Böylece std :: mesafe eşleşme sayısını döndürmelidir. Gcc 4.6.1 ve VS 2013'ü match_count olmadan denedim ve gayet iyi çalışıyor. – gilgamash

3

Bunu kullanabilirsiniz:

int countMatchInRegex(std::string s, std::string re) 
{ 
    std::regex words_regex(re); 
    auto words_begin = std::sregex_iterator(
     s.begin(), s.end(), words_regex); 
    auto words_end = std::sregex_iterator(); 

    return std::distance(words_begin, words_end); 
} 

Örnek kullanım:

std::cout << countMatchInRegex("Harry Botter - The robot who lived.", "[^\\s]+"); 

Çıktı:

7