正規表現が正しく機能していないようです。ECMAScript の複数行テキストでは、この正規表現begin\n([\s\S]*\nend)?
は私が必要としているものと正確に一致し、ここでテストしました。
それを 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
エンジンの構文と複数行の文字列の処理方法の詳細な説明はどこにありますか。