2010-12-10 6 views
6

Je pensais que $ indique la fin de la chaîne. Cependant, le morceau de code suivant donne "testbbbccc" comme résultat, ce qui est assez étonnant pour moi ... Cela signifie que $ correspond réellement à la fin de la ligne, pas à la fin de la chaîne entière.C++ TR1 regex - option multiligne

#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; 
    } 
} 

J'ai essayé de trouver un interrupteur « multiligne » (qui peut effectivement être facilement trouvés dans PCRE), mais sans succès ... quelqu'un peut me pointer vers la bonne direction?

Cordialement, RP

+0

qui mise en œuvre de TR1 utilisez-vous? –

+0

J'utilise Visual Studio 2008. –

+0

comme je l'ai dit ci-dessous - essayez \ z au lieu de $ –

Répondre

2

Comme Boost :: Regex a été sélectionné pour TR1, procédez comme suit:

De Boost::Regex

Ancres:

Un caractère '^' doit correspondre au début d'une ligne lorsqu'il est utilisé comme premier caractère d'une expression, ou premier caractère d'une sous-expression.

un caractère « $ » doit correspondre à la fin de une ligne lorsqu'il est utilisé comme le dernier caractère d'une expression, ou le dernier caractère d'une sous-expression.

Donc le comportement que vous avez observé est correct.

De: Boost Regex ainsi:

\A Matches au début d'un tampon seulement (le même que \`).
\z Correspond à la fin d'un tampon uniquement (identique à \').
\Z recherche une séquence facultative de nouvelles lignes à la fin d'un tampon: équivalent à l'expression régulière \n*\z

J'espère que cela aide.

1

Il n'y a pas de commutateur multiligne dans les expressions rationnelles TR1. Ce n'est pas exactement la même chose, mais vous pouvez obtenir les mêmes fonctionnalités tout correspondant:

(.|\r|\n)*? 

Cela correspond non avidement chaque personnage, y compris la nouvelle ligne et retour chariot.

Remarque: N'oubliez pas d'échapper les barres obliques inverses '\' comme ceci '\\' si votre motif est une chaîne C++ dans le code.

Note 2: Si vous ne voulez pas capturer le contenu appariés, ajoutez « : » au support d'ouverture:

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