2012-06-20 4 views
5

Я не могу заставить регулярное выражение работать правильно. В многострочном тексте в ECMAScript это регулярное выражение begin\n([\s\S]*\nend)? соответствует именно тем, что мне нужно, и I tested it here.C++ std :: regex multiline синтаксис

Когда я переводил его на C++, он не соответствует одному и тому же тексту.

Вот мой код в Visual C++ 2010:

#include <iostream> 
#include <regex> 

int main(int argc, char *argv[]) { 
    std::regex metadataBlockRegex("begin\\n([\\s\\S]*\\nend)?", 
     std::regex::ECMAScript); 

    std::string text = 
     "begin\n" 
     " 123\n" 
     "end\n"; 

    std::sregex_iterator blocksBegin(text.begin(), text.end(), metadataBlockRegex); 
    std::sregex_iterator blocksEnd; 

    for (auto blockMatch = blocksBegin; blockMatch != blocksEnd; ++blockMatch) { 
      std::cout << (*blockMatch)[0].str(); 
    } 
    return 0; 
} 

Это выводит только «начать», и я ожидал, что матч всего текста.

Мой вопрос: что здесь не так, и где я могу найти подробное описание синтаксиса двигателей std::regex и как они обрабатывают многострочные строки.

+0

Эта программа печатает весь текст (кроме последнего '\ n', который не сопоставляется) с clang ++/libC++ – Cubbi

+0

Это ведет себя как Gart описывает в MSVC10. Новая строка не соответствует, а niether - после нее. –

+0

Также печатает всю строку с 'boost :: regex' –

ответ

-1

LWG 2503 добавлен параметр синтаксиса multiline, который должен заставить вашу программу работать должным образом при использовании этой опции (для реализаций C++, которые поддерживают эту новую функцию).

LWG 2343 имеет еще один фон, который объясняет, что объекты ECMAScript RegExp имеют свойство Multiline, которое по умолчанию имеет значение false, и поведение различных реализаций C++ regex.

Оригинальный ответ от 2012:

, что здесь не так

Не уверен, это выглядит нормально, но только C++ 11 реализаций У меня есть доступ к не поддерживают <regex>

где можно найти подробное описание синтаксиса std :: regex engines и как они обрабатывают многострочные строки.

Вы не можете, насколько я знаю. Лучшее место для поиска - это, вероятно, документация для Boost.Regex, но имейте в виду, что она перемещается, поскольку она была предложена для стандартизации и имеет некоторые функции, отсутствующие в std::regex.

+0

Это очень грустно – Gart

+0

У Josuttis есть описание того, как разные грамматики регулярных выражений отличаются. Поведение, которое вы видите, будет соответствовать грамматике egrep, где \ n разделяет альтернативные шаблоны, поэтому 'begin' является допустимым совпадением для первого шаблона. Однако грамматика ECMAScript не должна лечить \ n. –

5

Нет многострочной поддержки, в любом случае ... не в MSVC10.

Вы должны фальсифицировать многострочный с \ г & \ п в вашей модели. Это большой облом.