c++ - <regex> std::regex 相当于 Qt 的 QRegularExpression::isValid() 且不会触发异常

标签 c++ regex exception std c++17

我正在尝试将一些正则表达式工具从 Qt 迁移到 std.在 Qt 中,我可以在使用 isValid() 之前测试正则表达式是否有效。

在标准的 <regex> ,我看不出有什么办法可以做到这一点。所以现在,我有 try/catch block 使用用户提供的正则表达式创建正则表达式,然后尝试将其与 1 个字符的字符串进行匹配以快速触发 std::regex_error没有加载实际搜索字符串的异常,这样我就可以提前退出。在我看来,这是一个肮脏的黑客行为,但我不确定是否有更好的方法来使用 std::regex 有效地测试它们。 。我基本上是在尝试避免在使用该工具的自动输入时捕获和处理异常造成的性能问题。

try
{
    const std::regex regex_exception_trigger(regex_string);
    std::smatch stability_match;
    const std::string test_string = "0";
    if (std::regex_search(test_string.begin(), test_string.end(), stability_match, regex_exception_trigger)) {}
}
catch (std::regex_error &re) { std::cerr << re.what() << std::endl; print_help(); return exit_enum::BAD_REGEX;  }

最佳答案

如果您想捕获所有错误,请按照 try{}catch{}catch{}catch{} 顺序执行所有操作。

我将构造与使用分开。

伪代码

std::regex Rx;
bool bIsConstructError = false;

////////////////////////////////////////
bool SetRx( std::string& strRx )
{
   bIsConstructError = false;
   try 
   {
      Rx.assign( "", 0);
      Rx.assign( strRx, 0 );
   }
   catch ( std::regex_error & e )
   {
      bIsConstructError = true;
      return false;
   }
   catch ( std::out_of_range & e )
   {
      bIsConstructError = true;
      return false;
   }
   catch ( std::runtime_error & e )
   {
      bIsConstructError = true;
      return false;
   }
   return true;
}

////////////////////////////////////////
bool  findText( std::string& strTarget )
{
   if ( bIsConstructError )
      return false;

   bool bRet = true;

   std::smatch _M;
   std::string::const_iterator start = strTarget.begin();
   std::string::const_iterator end = strTarget.end();

   try
   {
      if ( regex_search( start, end, _M, Rx, 0 ) )
      {
          // do something
      }
   }
   catch ( std::out_of_range & e )
   {
      bRet = false;
   }
   catch ( std::runtime_error & e )
   {
      bRet = false;
   }
   return bRet;
}

关于c++ - <regex> std::regex 相当于 Qt 的 QRegularExpression::isValid() 且不会触发异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44769597/

相关文章:

C++ 转义字符串中出现的\

regex - 如何使用正则表达式和 shell 从字符串中提取值?

c# - 异常文档的自动化

php - 当文本也包含 'of' 时,正则表达式提取包含 'Isle of Man' (如 'of' )的地名

C++ STL 的 copy() 异常安全

java - 为什么这段java代码没有捕获所有异常

C++(C 字符串)释放的指针未分配

c++ - 如何找出在 DLL 中调用了哪些函数?

使用另一个类的 C++ 方法声明

java - 正则表达式不匹配所有