2010-12-10 20 views
6

Pensé que $ indica el final de la cadena. Sin embargo, el siguiente fragmento de código da como resultado "testbbbccc", lo cual es bastante sorprendente para mí ... Esto significa que $ realmente coincide con el final de la línea, no con el final de toda la cadena.C++ TR1 regex - opción multilínea

#include <iostream> 
#include <regex> 

using namespace std; 

int main() 
{ 
    tr1::regex r("aaa([^]*?)(ogr|$)"); 
    string test("bbbaaatestbbbccc\nddd"); 
    vector<int> captures; 
    captures.push_back(1); 
    const std::tr1::sregex_token_iterator end; 
    for (std::tr1::sregex_token_iterator iter(test.begin(), test.end(), r, captures); iter != end;) 
    { 
     string& t1 = iter->str(); 
     iter++; 
     cout &lt;&lt; t1; 
    } 
} 

que han estado tratando de encontrar un interruptor "multilínea" (que en realidad se pueden encontrar fácilmente en PCRE), pero sin éxito ... ¿Puede alguien que me señale la dirección correcta?

Saludos, RP

+0

cuales ejecución de TR1 está usando? –

+0

Estoy usando Visual Studio 2008. –

+0

como dije a continuación - pruebe \ z en lugar de $ –

Respuesta

2

Como Boost :: Regex fue seleccionado para TR1, intente lo siguiente:

De Boost::Regex

Anclas:

A '^' carácter deberá coincide con el inicio de una línea cuando se utiliza como el primer carácter de una expresión, o el primer carácter de una sub-expresión. carácter

'$' A deberá coincidir con el final de una línea cuando se utiliza como último carácter de una expresión, o el último carácter de una sub-expresión.

Entonces el comportamiento observado es el correcto.

Desde: Boost Regex así:

\A Partidos en el inicio de un tampón única (el mismo que \`).
\z coincidencias en al final de un búfer solamente (el mismo que \').
\Z coincide con una secuencia opcional de saltos de línea al final de un tampón: equivalente a la expresión regular \n*\z

Espero que ayude.

1

No hay conmutador multilínea en las expresiones regulares TR1. No es exactamente el mismo, pero se puede obtener la misma funcionalidad a juego todo:

(.|\r|\n)*? 

Esto coincide con no con avidez cada personaje, incluyendo nueva línea y retorno de carro.

Nota: Recuerde escapar de las barras diagonales inversas '\' como esta '\\' si su patrón es una cadena C++ en el código.

Nota 2: Si no desea capturar los contenidos coincidentes, añada ':? A del corchete de apertura:

(?:.|\r|\n)*?