gpt4 book ai didi

c++ - std::regex 等价于 Qt 的 QRegularExpression::isValid() 而不会触发异常

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:45 28 4
gpt4 key购买 nike

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

在标准的<regex> ,我看不到这样做的方法。所以现在,我有 try/catch使用用户提供的正则表达式制作正则表达式的 block ,然后尝试将其与 1 个字符的字符串匹配以快速触发 std::regex_error没有加载实际搜索字符串的异常,所以我可以提前退出。这是一个肮脏的黑客 IMO,但我不确定是否有更好的方法来有效地测试它们 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/

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