我正在尝试将一些正则表达式工具从 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/