2011-09-05 10 views
10

estoy tratando de extraer subcoincidencias desde un archivo de texto usando expresiones regulares impulso. Actualmente, solo estoy devolviendo la primera línea válida y la línea completa en lugar de la dirección de correo electrónico válida. Intenté usar el iterador y usar subcompeticiones, pero no estaba teniendo éxito. Aquí está el código actual:Extracción subcoincidencias utilizando impulso de expresiones regulares en 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(); 
} 

Respuesta

16

Uso 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

Tal vez mi expresión regular está mal pero eso no dando resultados adecuados para mí. – John

+0

Fue la expresión regular, gracias. – 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; 
    } 
} 

La salida es la siguiente

WHAT 0 abcdef 
WHAT 1 abc 
WHAT 2 def 

Boost utiliza subcoincidencias entre paréntesis, y la primera subcoincidencia es siempre el cadena coincidente completa. regex_match tiene que coincidir con toda la línea de entrada contra el patrón, si está tratando de igualar una subcadena, utilice regex_search lugar.

El ejemplo que se ha usado anteriormente utiliza la sintaxis de expresiones regulares POSIX extendido, que se especifica mediante el impulso :: parámetro regex :: extendida. Omitir ese parámetro cambia la sintaxis para usar la sintaxis de expresiones regulares de estilo perl. Otra sintaxis de expresiones regulares está disponible.

Cuestiones relacionadas