2010-02-08 17 views
10

Estoy familiarizado con Regex, pero cada vez que trato de encontrar algún ejemplo o documentación para usar regex con computadoras Unix, solo obtengo tutoriales sobre cómo escribir expresiones regulares o cómo usarlas. NET bibliotecas específicas disponibles para Windows. He estado buscando por un tiempo y no puedo encontrar buenos tutoriales en C++ regex en máquinas Unix.Uso de expresiones regulares con C++ en Unix

lo que estoy tratando de hacer:

analizar una cadena usando expresiones regulares rompiéndolo y entonces la lectura de los diferentes subgrupos. Para hacer una analogía PHP, algo así como preg_match que devuelve $ coincidencias.

+0

eso sería 'preg_match_all (...)' entonces, no 'preg_match (...)'. –

+1

Posiblemente porque el estándar de C++ no especifica ninguna clase de expresión regular. –

+0

Neil, pero después de todo php ni siquiera proporciona el estándar ;-) –

Respuesta

13

Considere el uso de Boost.Regex.

Un ejemplo (desde el sitio web):

bool validate_card_format(const std::string& s) 
{ 
    static const boost::regex e("(\\d{4}[- ]){3}\\d{4}"); 
    return regex_match(s, e); 
} 

Otro ejemplo:

// match any format with the regular expression: 
const boost::regex e("\\A(\\d{3,4})[- ]?(\\d{4})[- ]?(\\d{4})[- ]?(\\d{4})\\z"); 
const std::string machine_format("\\1\\2\\3\\4"); 
const std::string human_format("\\1-\\2-\\3-\\4"); 

std::string machine_readable_card_number(const std::string s) 
{ 
    return regex_replace(s, e, machine_format, boost::match_default | boost::format_sed); 
} 

std::string human_readable_card_number(const std::string s) 
{ 
    return regex_replace(s, e, human_format, boost::match_default | boost::format_sed); 
} 
0

Está buscando regcomp, regexec and regfree.

Una cosa a tener en cuenta es que las expresiones regulares de Posix realmente implementan dos idiomas diferentes, regular (predeterminado) y extendido (incluya el indicador REG_EXTENDED en la llamada a regcomp). Si vienes del mundo PHP, el lenguaje extendido está más cerca de lo que estás acostumbrado.

+0

mismo comentario que @epatel –

9

Busque la documentación para las expresiones regulares TR1 o (casi equivalentemente) aumente la regex. Ambos funcionan muy bien en varios sistemas Unix. Las clases de expresiones regulares de TR1 han sido aceptadas en C++ 0x, por lo que, aunque todavía no forman parte del estándar, serán razonablemente pronto.

Editar: Para dividir una cadena en subgrupos, puede usar un sregex_token_iterator. Puede especificar lo que quiere que coincida como tokens o lo que quiere que coincida como separadores. He aquí una demostración polvo rápido de ambos:

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

int main() { 

    std::string line; 

    std::cout << "Please enter some words: " << std::flush; 
    std::getline(std::cin, line); 

    std::tr1::regex r("[ .,:;\\t\\n]+"); 
    std::tr1::regex w("[A-Za-z]+"); 

    std::cout << "Matching words:\n"; 
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), w), 
     std::tr1::sregex_token_iterator(), 
     std::ostream_iterator<std::string>(std::cout, "\n")); 

    std::cout << "\nMatching separators:\n"; 
    std::copy(std::tr1::sregex_token_iterator(line.begin(), line.end(), r, -1), 
     std::tr1::sregex_token_iterator(), 
     std::ostream_iterator<std::string>(std::cout, "\n")); 

    return 0; 
} 

Si usted le da entrada como esta: "Esto es un poco de 999 texto", el resultado es la siguiente:

Matching words: 
This 
is 
some 
text 

Matching separators: 
This 
is 
some 
999 
text 
+0

También puede usar Boost Xpressive (http://www.boost.org/doc/libs/1_42_0/doc/html/xpressive.html) que le proporcionará la comprobación de errores en tiempo de compilación de sus expresiones regulares. Dudo que alguna vez se convierta en estándar aunque :) – Manuel

+0

Este es el más ideal. Pero en realidad lo encontré antes y el servidor al que tengo que recurrir no lo admite. :/ –

+0

@Manuel: la sintaxis del comentario negativo a veces apesta, ¿no? ¡¿También estás usando 1.38 ?! Use '/ release /' en las URL de impulso para la última versión de lanzamiento. –

0

Para expresiones regulares compatibles con Perl (pcre/preg), sugeriría boost.regex.

0

No dude en echar un vistazo a esta pequeña herramienta de color grep escribí.

En github

Utiliza regcomp, regexec y regfree que R Samuel Klatchko refiere a.

+0

¿Tiene algún ejemplo de devolver los subgrupos y manipularlos? –

+0

@Stanislav Palatnik Creo que se maneja en (alrededor de) la línea 95 – epatel

Cuestiones relacionadas