[英]boost::regex_constants::error_type to string
我有一個 function 檢查表達式是否與正則表達式匹配,並返回 boost::regex_constants::error_type,它會在出現異常時記錄錯誤:
boost::regex_constants::error_type RegexMatch(const std::string& p_expression, const std::string& p_pattern)
{
boost::regex_constants::error_type returnValue = boost::regex_constants::error_unknown;
try
{
if (boost::regex_match(p_expression, boost::regex(p_pattern)))
{
returnValue = boost::regex_constants::error_ok;
}
else
{
returnValue = boost::regex_constants::error_no_match;
}
}
catch(boost::regex_error& e)
{
returnValue = e.code();
LOG_ERROR("Error checking if [%s] expression matches pattern [%s]: boost::regex_error [%s]",
p_expression.c_str(),
p_pattern.c_str(),
e.what());
}
return returnValue;
}
但是在客戶端,調用者只得到boost::regex_constants::error_type
作為結果,而根據上下文,客戶端可能希望顯示“人類可讀”錯誤。
現在我的問題是知道是否有一個原生的升壓 function 來做到這一點? 因為找不到,於是我自己做了function:
std::string BoostRegexErrorTypeToString(const boost::regex_constants::error_type p_boostRegexErrorType)
{
return boost::regex_error(p_boostRegexErrorType).what();
}
請注意,我返回std::string
而不是直接返回const char*
(由what()
返回),因為在返回const char*
時,對於某些錯誤類型,例如error_ok
,返回 "et*)" 而不是 "成功”。
最后,要測試此代碼,您可以使用以下循環:
for (int intErrorType = boost::regex_constants::error_ok; // error_ok is the first
intErrorType <= boost::regex_constants::error_unknown; // error_unknown is the last
++intErrorType)
{
const boost::regex_constants::error_type errorType = (boost::regex_constants::error_type)intErrorType;
LOG_DEBUG("Regex error [%d] text is [%s]",
errorType,
BoostRegexErrorTypeToString(errorType).c_str());
}
謝謝
首先,原因是
因為在返回 const char* 時,對於某些錯誤類型,例如 error_ok,返回 "et*)" 而不是 "Success"。
發生是因為您返回了一個過時的指針( what()
指向runtime_error
實例中的成員數據,並且在從您的 function 返回后將被破壞。)。
function boost 用於獲取錯誤字符串是不公開的:
regex_error::regex_error(regex_constants::error_type err)
: std::runtime_error(::boost::BOOST_REGEX_DETAIL_NS::get_default_error_string(err))
, m_error_code(err)
, m_position(0)
{
}
您可以看到::boost::BOOST_REGEX_DETAIL_NS::get_default_error_string(err)
位於詳細名稱空間中。
如果你願意,你可以閱讀源代碼:
BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_error_string(regex_constants::error_type n)
{
static const char* const s_default_error_messages[] = {
"Success", /* REG_NOERROR 0 error_ok */
"No match", /* REG_NOMATCH 1 error_no_match */
"Invalid regular expression.", /* REG_BADPAT 2 error_bad_pattern */
"Invalid collation character.", /* REG_ECOLLATE 3 error_collate */
"Invalid character class name, collating name, or character range.", /* REG_ECTYPE 4 error_ctype */
"Invalid or unterminated escape sequence.", /* REG_EESCAPE 5 error_escape */
"Invalid back reference: specified capturing group does not exist.", /* REG_ESUBREG 6 error_backref */
"Unmatched [ or [^ in character class declaration.", /* REG_EBRACK 7 error_brack */
"Unmatched marking parenthesis ( or \\(.", /* REG_EPAREN 8 error_paren */
"Unmatched quantified repeat operator { or \\{.", /* REG_EBRACE 9 error_brace */
"Invalid content of repeat range.", /* REG_BADBR 10 error_badbrace */
"Invalid range end in character class", /* REG_ERANGE 11 error_range */
"Out of memory.", /* REG_ESPACE 12 error_space NOT USED */
"Invalid preceding regular expression prior to repetition operator.", /* REG_BADRPT 13 error_badrepeat */
"Premature end of regular expression", /* REG_EEND 14 error_end NOT USED */
"Regular expression is too large.", /* REG_ESIZE 15 error_size NOT USED */
"Unmatched ) or \\)", /* REG_ERPAREN 16 error_right_paren NOT USED */
"Empty regular expression.", /* REG_EMPTY 17 error_empty */
"The complexity of matching the regular expression exceeded predefined bounds. "
"Try refactoring the regular expression to make each choice made by the state machine unambiguous. "
"This exception is thrown to prevent \"eternal\" matches that take an "
"indefinite period time to locate.", /* REG_ECOMPLEXITY 18 error_complexity */
"Ran out of stack space trying to match the regular expression.", /* REG_ESTACK 19 error_stack */
"Invalid or unterminated Perl (?...) sequence.", /* REG_E_PERL 20 error_perl */
"Unknown error.", /* REG_E_UNKNOWN 21 error_unknown */
};
return (n > ::boost::regex_constants::error_unknown) ? s_default_error_messages[ ::boost::regex_constants::error_unknown] : s_default_error_messages[n];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.