2011-05-26 19 views
5

düzenli ifadeli eşdeğer, ben bunu yapabilirsiniz:std :: Perl '/ g' küresel değiştirici

$text = '1747239'; 
@matches = ($text =~ m/(\d)/g); 
# @matches now contains ('1', '7', '4', '7', '2', '3', '9') 

C++ Normal ifade eşlemeyi kullanarak, böylece bir maç olsun bu davranışı çoğaltmak için en iyi yolu nedir tüm maçları içeren set?

Şu an bu var: -

compiledRegex = std::regex(regex, std::tr1::regex_constants::extended); 
regex_search(text, results, compiledRegex); 

int count = results.size(); 
// Alloc pointer array based on count * sizeof(mystruct). 
for (std::cmatch::iterator match = results.begin(); 
     match != results.end(); 
     ++match) 
{ 
    // Do something with match; 
} 

Ancak bu sadece ince olduğu/g olmadan sadece Perl gibi, bana ilk maçı verecektir, ama ben/g etkisini istiyorum.

Bunu yapmak için iyi bir yol var mı, yoksa normal ifadeyi tekrar tekrar çalıştırmalı mıyım?

cevap

8

Birkaç kez regex_search numaralı telefonu aramanız gerekir. Dönüş değeri daha fazla eşleşme olup olmadığını belirtir. Her aradığınızda yeni bir eşleşme elde edersiniz. Sonuçlarla döndürülen yineleyici, normal ifadenizde tanımlanan grup eşleştirmelerini geçer. senin durumunda count == 1

std::string::const_iterator text_iter = text.cbegin(); 
compiledRegex = std::regex(regex, std::tr1::regex_constants::extended); 

while (regex_search(text_iter, text.end(), results, compiledRegex)) 
{ 
    int count = results.size(); 
    // Alloc pointer array based on count * sizeof(mystruct). 
    for (std::cmatch::iterator group = results.begin(); 
      group != results.end(); 
      ++group) 
    { 
     // If you uses grouping in your search here you can access each group 
    } 

    std::cout << std::string(results[0].first, results[0].second) << endl; 
    text_iter = results[0].second; 
} 

oldukça fazla ben ile sarma buydu O

+0

yardımcı Umut neden ilk giriş budur, her zaman tüm maç olduğunu, ben bir bayrak yapmak regex_search yapmak için umuyordum sanırım o. Muhtemelen, metin işaretçisini her yinelemede son eşleşmenin sonuna taşımak zorunda mısın? –

+0

@JonB Haklısınız. Dize yerine yineleyiciler kullanılmalıdır. Her yinelemenin sonunda, arama yineleyicisi, 'results [0] .second' kullanılarak güncellenmelidir. Cevabımı çirkin bir şekilde güncelledim. – Eugene