2011-02-28 23 views
5

Tengo una expresión regular en C++ con Boost que coincide con líneas en cadenas de varias líneas. La búsqueda de Regex encuentra la primera coincidencia, sin embargo, estoy interesado en la última línea que coincide.Obtener la última coincidencia con Boost :: Regex

El código que estoy usando ahora es algo como esto:

matched = boost::regex_search(input, results, regex);    
if (!matched) { 
    return -1; // error code 
} 
matched_string = results["Group"]; 

Si regex fue "(?<Group>Data.)" y input fue "Data1 Data2 Data3", entonces es ahora matched_string"Data1". Quiero que sea "Data3".

Respuesta

5

operator[] de match_results devuelve un sub_match. sub_match hereda std::pair de iteradores. Sus miembros first y second corresponden a un rango coincidente. Por lo tanto, puede usar su second para el punto de inicio de una nueva búsqueda. Por ejemplo:

string input = "Data1 Data2 Data3"; 
regex re("(?<Group>Data.)"); 
string::const_iterator begin = input.begin(), end = input.end(); 
smatch results; 
while (regex_search(begin, end, results, re)) { 
    smatch::value_type r = results["Group"]; 
    begin = r.second; 
} 

Espero que esto ayude.

+1

El uso de 'smatch :: const_reference r = results [" Group "]' debe evitar algunas copias innecesarias. – maxschlepzig

Cuestiones relacionadas