希望有人能回答这个问题。这是一些示例代码。
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&amp;”? (这是我从Intellisense验证的)。一个“std :: string&amp;”看起来更合适。
我正在使用VS11 beta C ++编译器。
答案 0 :(得分: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&amp;”看起来比“const std :: string&amp;”更合适。
在我看来“const std :: string&amp;”看起来更合适,因为'std :: regex_match'不需要更改此参数。