2010-12-10 2 views
6

Я думал, что $ указывает конец строки. Однако следующий фрагмент кода дает «testbbbccc» в результате, что для меня очень удивительно ... Это означает, что $ на самом деле соответствует концу строки, а не концу всей строки.C++ TR1 regex - многострочный вариант

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

Я пытался найти «многострочный» переключатель (который на самом деле можно легко найти в PCRE), но без успеха ... Может кто-то мне точку в правильном направлении?

С уважением, RP

+0

, реализация которых в TR1 вы используете? – 2010-12-10 13:48:12

ответ

2

Как повышение :: Regex был выбран для TR1, попробуйте следующее:

От Boost::Regex

Якоря:

А '^' символ должен совпадают с началом строки при использовании в качестве первого символа выражения или первый символ подвыражения. характер

A «$» должен соответствовать концу линии, при использовании в качестве последнего символа выражения или последнего характера подвыражения.

Таким образом, поведение, которое вы наблюдаете, является правильным.

От: Boost Regex а:

\A совпадений в начале буфера только (такой же, как \`).
\z Совпадает с конец буфера (то же, что и \').
\Z Матчи необязательной последовательности из символов новой строки в конце буфера: эквивалентно регулярному выражению \n*\z

Я надеюсь, что помогает.

1

В регуляторах TR1 нет многострочного переключателя. Это не совсем то же самое, но вы могли бы получить те же функциональность, соответствующих всем:

(.|\r|\n)*? 

Это соответствует без жадностью каждому символу, включая новую линию и возврат каретки.

Примечание: не забудьте избежать обратных косых черт '\' вот так '\\', если ваш шаблон является строкой C++ в коде.

Примечание 2: Если вы не хотите, чтобы захватить совпавшие содержимое, добавьте «:» на открывающей скобкой:

(?:.|\r|\n)*? 
Смежные вопросы