4

「。」と一致する クラスとの文字列で、std::tr1::regex奇妙な回避策を使用するようになります。

「\\\\」を確認する必要があるのはなぜですか。それ以外の "\\。"?

regex(".") // Matches everything (but "\n") as expected.
regex("\\.") // Matches everything (but "\n").
regex("\\\\.") // Matches only ".".

誰かが私に理由を説明できますか?boost::regexこの構文を必要としないクラスを使用してコードを記述していたので、本当に気になります。

編集:申し訳ありませんが、regex("\\\\.")何にも一致しないようです。

Edit2:いくつかのコード

void parser::lex(regex& token)
{
    // Skipping whitespaces
    {
        regex ws("\\s*");
        sregex_token_iterator wit(source.begin() + pos, source.end(), ws, regex_constants::match_default), wend;
        if(wit != wend)
            pos += (*wit).length();
    }

    sregex_token_iterator it(source.begin() + pos, source.end(), token, regex_constants::match_default), end;
    if (it != end)
        temp = *it;
    else
        temp = "";
}
4

3 に答える 3

11

これは\.、言語自体が単一の文字として解釈しようとしているエスケープ シーケンスとして解釈されるためです。必要なのは、正規表現に実際の文字列「\.」を含めることです。これは、バックスラッシュ文字 (\) のエスケープ シーケンスであるため、\\.書き込まれます。\\

于 2012-12-12T14:40:47.397 に答える
1

結局のところ、実際の問題はsregex_token_iterator使用方法によるものでした。を使用match_defaultすると、間に一致しないものがあったとしても、文字列内の次の一致があれば、常にそれを見つけることを意味しました。あれは、

string source = "AAA.BBB";
regex dot("\\.");
sregex_token_iterator wit(source.begin(), source.end(), dot, regex_constants::match_default);

一致がなかったことを報告するのではなく、ドットで一致を示します。

match_continuous解決策は、代わりに使用することです。

于 2012-12-12T16:25:07.287 に答える
0

ASCII コードでドットをエスケープしてみてください。

regex("\\x2E")
于 2012-12-12T14:51:26.577 に答える