2011-09-05 16 views
10

Próbuję wyodrębnić submikoty z pliku tekstowego za pomocą doładowania regex. Obecnie zwracam tylko pierwszą prawidłową linię i pełną linię zamiast prawidłowego adresu e-mail. Próbowałem używać iteratora i używania submatches, ale nie miałem z nim powodzenia. Oto aktualny kod:Wyodrębnianie submatów przy użyciu regex doładowania w języku C++

if(Myfile.is_open()) { 
    boost::regex pattern("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"); 
    while(getline(Myfile, line)) { 
      string::const_iterator start = line.begin(); 
      string::const_iterator end = line.end(); 
      boost::sregex_token_iterator i(start, end, pattern); 
      boost::sregex_token_iterator j; 
      while (i != j) { 
      cout << *i++ << endl; 

    } 
    Myfile.close(); 
} 

Odpowiedz

16

Zastosowanie boost::smatch.

boost::regex pattern("what(ever) ..."); 
boost::smatch result; 
if (boost::regex_search(s, result, pattern)) { 
    string submatch(result[1].first, result[1].second); 
    // Do whatever ... 
} 
+0

Być może mój Regeks jest w błędzie, ale to nie przynosi właściwych wyników. – John

+0

Czy regex, dzięki. – John

13
const string pattern = "(abc)(def)"; 
const string target = "abcdef"; 

boost::regex regexPattern(pattern, boost::regex::extended); 
boost::smatch what; 

bool isMatchFound = boost::regex_match(target, what, regexPattern); 
if (isMatchFound) 
{ 
    for (unsigned int i=0; i < what.size(); i++) 
    { 
     cout << "WHAT " << i << " " << what[i] << endl; 
    } 
} 

Wyjście jest następujący

WHAT 0 abcdef 
WHAT 1 abc 
WHAT 2 def 

doładowania wykorzystuje nawiasach submatches, a pierwszy submatch jest zawsze pełny dopasowane ciąg. regex_match musi dopasować całą linię danych wejściowych do wzorca, jeśli próbujesz dopasować podciąg, użyj zamiast tego regex_search.

W powyższym przykładzie użyłem rozszerzonej składni regex posix, która jest określona za pomocą parametru boost :: regex :: extended. Pominięcie tego parametru zmienia składnię, aby użyć składni regex stylu Perla. Dostępna jest inna składnia wyrażeń regularnych.

Powiązane problemy