【问题标题】:Can you prevent std::regex from throwing exception on invalid expressions?你能防止 std::regex 对无效表达式抛出异常吗?
【发布时间】:2018-08-08 16:45:05
【问题描述】:
std::regex regex("*", std::regex_constants::icase);

这将引发异常。如果我有异常disabled,它将终止应用程序,这意味着我无法捕获它并且像往常一样不对其执行任何操作。

有没有办法防止无效的正则表达式在构造时抛出异常?或者某种std::regex::isvalid("*") 检查是否存在?

我在想也许我可以想出一个单独的正则表达式,在我尝试构造函数之前解析输入的正则表达式字符串,但我更喜欢替代方案。

【问题讨论】:

  • 只是没有捕获异常并且什么都不做是否符合您的要求?
  • @Blondie 不。当异常被禁用时,你不能只捕获异常。你甚至不能抛出异常
  • 你不能用正则表达式解析正则表达式。
  • 你真的需要使用正则表达式吗?
  • 在您禁用异常的那一刻,您不再使用标准 C++。在这种情况下,您可能应该指定您的编译器和体系结构。也许有一个特定于编译器的解决方案,但根据定义,不可能有一个标准的解决方案。

标签: c++ regex std


【解决方案1】:

你不能。没有标准的方法来做到这一点。异常是标准库的固有部分,即使是不抛出自身异常的接口(例如臭名昭​​著的基于error_code<filesystem> 接口)也可以为其他操作抛出异常。

最好的办法是使用设计为无异常的库,例如启用no_except 标志的Boost.Regex。然后,您可以在构造 boost::basic_regex 后使用成员函数 status 检查错误。

【讨论】:

  • 花了一天时间研究之后,似乎确实没有办法做到这一点。我不能使用图书馆,所以这对我来说很重要。我将不得不放弃这个想法,但除非其他人想出一些黑魔法,否则我会将其标记为答案。
猜你喜欢
  • 2018-12-23
  • 2014-10-19
  • 1970-01-01
  • 2013-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
相关资源
最近更新 更多