Я не могу заставить регулярное выражение работать правильно. В многострочном тексте в 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
и как они обрабатывают многострочные строки.
Эта программа печатает весь текст (кроме последнего '\ n', который не сопоставляется) с clang ++/libC++ – Cubbi
Это ведет себя как Gart описывает в MSVC10. Новая строка не соответствует, а niether - после нее. –
Также печатает всю строку с 'boost :: regex' –