6

正規表現が正しく機能していないようです。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エンジンの構文と複数行の文字列の処理方法の詳細な説明はどこにありますか。

4

2 に答える 2

5

とにかく、複数行のサポートはありません... MSVC10ではありません。

パターンで\r & \nを使用して複数行を偽造する必要があります。それは大きな問題です。

于 2012-10-16T21:17:27.777 に答える
0

LWG 2503は構文オプションを追加しましたmultiline。これにより、オプションを使用したときにプログラムが期待どおりに動作するはずです (その新しい機能をサポートする C++ 実装の場合)。

LWG 2343にはさらに背景があり、ECMAScript RegExp オブジェクトには Multiline プロパティがあり、デフォルトは false であり、さまざまな C++regex実装の動作について説明しています。

2012年の元の回答:

ここで何が問題なのですか

よくわかりませんが、私がアクセスできる唯一の C++11 実装はサポートされていません<regex>

std::regex エンジンの構文と、複数行の文字列を処理する方法の詳細な説明はどこにありますか。

私が知る限り、あなたはできません。おそらくBoost.Regexのドキュメントを参照するのが最適ですが、標準化のために提案され、.regex には存在しないいくつかの機能が含まれているため、このドキュメントは移動されていることに注意してstd::regexください。

于 2012-06-20T14:53:13.180 に答える