gpt4 book ai didi

c++ - 为什么我在 VS2015 中创建正则表达式对象时出现异常?

转载 作者:行者123 更新时间:2023-11-28 05:59:19 25 4
gpt4 key购买 nike

这段代码有异常

Date & Date::operator=(const std::string & str){
if (str.size() != 10)
throw std::exception("not a date");


std::regex r;// exception here
try { // exception here
std::regex regEx ("^[0-9]{4}[0-9]{2}[0-9]{2}");
}
catch (std::exception &e) {
e.what();
}
std::regex delims("([^.,;-]+)");

std::smatch match;
if (std::regex_match(str.cbegin(), str.cend(), match, regEx)) {
std::stringstream ss;
std::string tmp(match.str());
std::copy(std::sregex_token_iterator(tmp.cbegin(), tmp.cend(), delims, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(ss, "\n"));
ss >> year;
ss >> month;
ss >> day;
}
return *this;
}

如果我将类似的代码放在 main 函数中,则可以正常工作。我使用 Visual Studio 2015 Community Edition。

最佳答案

您的异常不会在构建正则表达式时发生,而是在您抛出自己的正则表达式时发生。

首先,您要检查字符串的长度是否正好为 10 个字符。如果您在字符串中放入一个大小为 10 的字符串,则一切正常:

int main()
{
std::string str = "20151107AB";
int year = 0;
int month = 0;
int day= 0;

if (str.size() != 10)
throw std::exception("not a date");

std::regex regEx("^[0-9]{4}[0-9]{2}[0-9]{2}");
std::regex delims("([^.,;-]+)");

std::smatch match;
if (std::regex_match(str.cbegin(), str.cend(), match, regEx)) {
std::stringstream ss;
std::string tmp(match.str());
std::copy(std::sregex_token_iterator(tmp.cbegin(), tmp.cend(), delims, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(ss, "\n"));
ss >> year;
ss >> month;
ss >> day;
}
}

如果删除“AB”,您将收到问题中所述的错误。

int main()
{
std::string str = "20151107";
int year = 0;
int month = 0;
int day= 0;

if (str.size() != 10)
throw std::exception("not a date");

std::regex regEx("^[0-9]{4}[0-9]{2}[0-9]{2}");
std::regex delims("([^.,;-]+)");

std::smatch match;
if (std::regex_match(str.cbegin(), str.cend(), match, regEx)) {
std::stringstream ss;
std::string tmp(match.str());
std::copy(std::sregex_token_iterator(tmp.cbegin(), tmp.cend(), delims, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(ss, "\n"));
ss >> year;
ss >> month;
ss >> day;
}
}

如果您现在删除长度检查,一切都会再次正常工作。

int main()
{
std::string str = "20151107";
int year = 0;
int month = 0;
int day= 0;

std::regex regEx("^[0-9]{4}[0-9]{2}[0-9]{2}");
std::regex delims("([^.,;-]+)");

std::smatch match;
if (std::regex_match(str.cbegin(), str.cend(), match, regEx)) {
std::stringstream ss;
std::string tmp(match.str());
std::copy(std::sregex_token_iterator(tmp.cbegin(), tmp.cend(), delims, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(ss, "\n"));
ss >> year;
ss >> month;
ss >> day;
}
}

此外,如果您捕获异常,一切仍然正常(但代码未执行)

int main()
{
try
{
std::string str = "20151107";
int year = 0;
int month = 0;
int day = 0;

if (str.size() != 10)
throw std::exception("not a date");

std::regex regEx("^[0-9]{4}[0-9]{2}[0-9]{2}");
std::regex delims("([^.,;-]+)");

std::smatch match;
if (std::regex_match(str.cbegin(), str.cend(), match, regEx)) {
std::stringstream ss;
std::string tmp(match.str());
std::copy(std::sregex_token_iterator(tmp.cbegin(), tmp.cend(), delims, -1),
std::sregex_token_iterator(),
std::ostream_iterator<std::string>(ss, "\n"));
ss >> year;
ss >> month;
ss >> day;
}
}
catch (std::exception& e)
{
//handle
}
}

所以我对此的假设是您不会在任何地方捕获异常,这可能会导致内存损坏,因为标准没有定义在这种情况下是否必须展开堆栈。

我会推荐给 1.阅读Does it make sense to catch exceptions in the main(...)? 2. 正确捕获Date::operator=

抛出的异常

也许您还想安装一个全局异常处理程序(以安全地关闭您的程序)。

还有一件事:当您只需要 8 个字符时,为什么要检查日期字符串的长度恰好为 10?

关于c++ - 为什么我在 VS2015 中创建正则表达式对象时出现异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33580336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com