Nie mogę sprawić, że mój regex działa poprawnie. W tekście wielowierszowym w ECMAScript to wyrażenie regularne begin\n([\s\S]*\nend)?
dokładnie odpowiada temu, czego potrzebuję, i I tested it here.C++ std :: regex składnia wieloliniowa
Kiedy tłumaczę to na C++, nie pasuje do tego samego tekstu.
Oto mój kod w 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;
}
to wyłącznie wyjście "begin" i spodziewałem się, że pasuje do całego tekstu.
Moje pytanie brzmi: co tu jest nie tak i gdzie mogę znaleźć szczegółowy opis składni silników i jak radzą sobie z ciągami wielowierszowymi.
Ten program wypisuje cały tekst (z wyjątkiem ostatniego '\ n', który nie jest dopasowany) z kodem ++/libC++ – Cubbi
Zachowuje się tak, jak Gart opisuje w MSVC10. Nowa linia nie jest dopasowana, a niether jest czymkolwiek po niej. –
Również wypisuje cały ciąg z 'boost :: regex' –