2013-06-10 2 views
1

Лучшее, что я могу придумать это:Группа поиска и замены Regex в C++?

#include <boost/algorithm/string/replace.hpp> 
#include <boost/regex.hpp> 
#include <iostream> 

using namespace std; 

int main() { 
    string dog = "scooby-doo"; 
    boost::regex pattern("(\\w+)-doo"); 
    boost::smatch groups; 
    if (boost::regex_match(dog, groups, pattern)) 
     boost::replace_all(dog, string(groups[1]), "scrappy"); 

    cout << dog << endl; 
} 

с выходом:

scrappy-doo 

.. есть более простой способ сделать это, что не включает в себя выполнение двух различных поисков? Может быть, с новым материалом C++ 11 (хотя я не уверен, что он совместим с gcc atm?)

ответ

2

std::regex_replace должен сделать трюк. Приведенный пример довольно близок к вашей проблеме, даже до того, чтобы показать, как высунуть ответ прямо в cout, если хотите. Вставка здесь для потомков:

#include <iostream> 
#include <iterator> 
#include <regex> 
#include <string> 

int main() 
{ 
    std::string text = "Quick brown fox"; 
    std::regex vowel_re("a|e|i|o|u"); 

    // write the results to an output iterator 
    std::regex_replace(std::ostreambuf_iterator<char>(std::cout), 
         text.begin(), text.end(), vowel_re, "*"); 

    // construct a string holding the results 
    std::cout << '\n' << std::regex_replace(text, vowel_re, "[$&]") << '\n'; 
} 
+1

Я вижу. Я нахожу этот интерфейс контр-интуитивным, так как вам нужно эффективно перестроить новую строку, используя синтаксис $ x, чтобы представлять группы регулярных выражений в предыдущей строке. При этом я не могу придумать ничего лучшего – mavix

Смежные вопросы