1

誰かがこれに答えてくれることを願っています。ここにいくつかのサンプルコードがあります。

namespace std {
#ifdef UNICODE
typedef wstring tstring;
typedef wstringstream tstringstream;
#define tcout std::wcout
#else
typedef string tstring;
typedef stringstream tstringstream;
#define tcout std::cout
#endif
typedef regex_iterator<std::tstring::const_iterator> TRegexIterator;
}

std::TRegexIterator::regex_type nPattern(_TEXT("-?[0-9]+(\\.[0-9]+)?((e|E)(\\+|-)[0-9]+)?"));
std::match_results<std::tstring::const_iterator> theMatches;
std::tstring test(_TEXT("-1.323E-23"));

tcout << _TEXT("Lvalue target string") << std::endl;
if (std::regex_match(test, theMatches, nPattern))
{
    for (auto i= 0; i < theMatches.size(); ++i)
        tcout << theMatches[i] << std::endl;
}

tcout << _TEXT("Rvalue target string") << std::endl;
if (std::regex_match(std::tstring(_TEXT("-1.323E-23")), theMatches, nPattern))
{
    for (auto i= 0; i < theMatches.size(); ++i)
        tcout << theMatches[i] << std::endl;
}

私が得ている問題は、右辺値ターゲット文字列との最初の一致結果が
、予想される「-1.323E-23」ではなく「1.323E-23」(はい、開始スペース付き) であることです。「std::match_results」がデータではなくポインターを格納するためだと思いますが、その場合、「std::regex_match」の最初のパラメーターが「const std::string&」なのはなぜですか? (これはIntellisenseから確認しました)。「std::string&」の方が適切に見えます。VS11 ベータ C++ コンパイラを使用しています。

4

1 に答える 1

0

はい、

これは、「std::match_results」がデータではなくポインターを格納するためです。

たとえば、以下のコードをテストします。

tcout << _TEXT("Lvalue target string") << std::endl;
if (std::regex_match(test, theMatches, nPattern))
{
    test = _TEXT(""); // change 'test' to invalidate 'theMatches' pointers
    for (auto i= 0; i < theMatches.size(); ++i)
        tcout << theMatches[i] << std::endl; // MEMORY ERROR!!!
}

しかし、なぜあなたは信じるのですか

「std::string&」は「const std::string&」よりも適切に見えます。

私の意見では、「std::regex_match」はこのパラメーターを変更する必要がないため、「const std::string&」の方が適切に見えます。

于 2012-06-21T20:48:31.390 に答える