6

$ は文字列の終わりを示していると思いました。ただし、次のコードは結果として「testbbbccc」を返します。これは私にとって非常に驚くべきことです...これは、$ が実際には文字列全体ではなく行末と一致することを意味します。

#include <iostream>
#include <regex>

using namespace std;

int main()
{
    tr1::regex r("aaa([^]*?)(ogr|$)");
    string test("bbbaaatestbbbccc\nddd");
    vector<int> captures;
    captures.push_back(1);
    const std::tr1::sregex_token_iterator end;
    for (std::tr1::sregex_token_iterator iter(test.begin(), test.end(), r, captures); iter != end; )
    {
        string& t1 = iter->str();
        iter++;
        cout &lt;&lt; t1;
    }
} 

「マルチライン」スイッチ (実際には PCRE で簡単に見つけることができます) を見つけようとしましたが、成功しませんでした... 誰かが私を正しい方向に向けることができますか?

よろしく、RP

4

2 に答える 2

2

TR1正規表現にはマルチラインスイッチはありません。まったく同じではありませんが、すべてに一致する同じ機能を取得できます。

(.|\r|\n)*?

これは、改行やキャリッジリターンを含め、貪欲ではないすべての文字に一致します。

注:パターンがコード内のC ++文字列である場合は、'\'このように円記号をエスケープすることを忘れないでください。'\\'

注2:一致したコンテンツをキャプチャしたくない場合は、最初の角かっこに「?:」を追加します。

(?:.|\r|\n)*?
于 2012-03-20T12:28:43.103 に答える
2

Boost::Regex が tr1 に選択されたので、次のことを試してください。

Boost::Regexから

アンカー:

「^」文字は、式の最初の文字、または部分式の最初の文字として使用される場合、行頭と一致する必要があります。

「$」文字は、式の最後の文字またはサブ式の最後の文字として使用される場合、行末と一致する必要があります。

したがって、観察した動作は正しいです。

From:正規表現もブーストします:

\Aバッファの先頭のみに一致します ( と同じ\`)。
\zバッファの末尾のみに一致します ( と同じ \')。
\Zバッファの末尾にあるオプションの改行シーケンスに一致します: 正規表現と同等です \n*\z

それが役立つことを願っています。

于 2010-12-10T13:59:24.890 に答える