2011-09-05 1 views
10

Sto tentando di estrarre i submatch da un file di testo usando boost regex. Attualmente sto solo restituendo la prima riga valida e la linea completa invece dell'indirizzo email valido. Ho provato a utilizzare l'iteratore e l'utilizzo di submatches ma non stavo avendo successo con esso. Ecco il codice corrente:Estrazione di submatch con boost regex in 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(); 
} 

risposta

16

Usa 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

Forse il mio Regex ha torto ma non sta producendo risultati adeguati per me. – John

+0

Era il regex, grazie. – 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; 
    } 
} 

L'output è il seguente

WHAT 0 abcdef 
WHAT 1 abc 
WHAT 2 def 

Boost utilizza submatches tra parentesi, e il primo submatch è sempre la stringa corrispondente completa. regex_match deve corrispondere all'intera riga di input rispetto al pattern, se si sta tentando di abbinare una sottostringa, utilizzare invece regex_search.

L'esempio utilizzato in precedenza utilizza la sintassi di regex estesa posix, che viene specificata utilizzando il parametro boost :: regex :: extended. Omettendo tale parametro si modifica la sintassi per usare la sintassi regex in stile perl. È disponibile un'altra sintassi regex.