[英]C++ Boost regex vs Standard Library regex match results
难以获得与标准库相同的结果,无法获得boost regex匹配结果。 意味着标准库在产生多个匹配项的多行输入中返回第一个匹配项。
目标是在运行此代码的产品遭受重大打击时获得最佳性能。 子字符串调用的速度非常慢,因此提高了工作效率。
该产品是C ++之前的C ++版本。我无法升级旧版本。
下面的例子:
_pattern: [A-Za-z0-9].+\\\\n[ \\t]*\\\\n
输入字符串:(换行必不可少)
CLINICAL: Left 2cm Firm Fibrous Lump @12:00.
No prior exams were available for comparison.
There is gynecomastia in both feet.
标准库版本的代码:
ORegExpr::index(const OString &inputStr, size_t* length, size_t start = 0) const {
if (start == O_NPOS)
return O_NPOS;
std::smatch reMatch;
std::regex re(_pattern);
std::string inputData = "";
if (start > 0 )
inputData = inputStr._string.substr(start);
else
inputData = inputStr._string;
if(std::regex_search(inputData,reMatch,re))
{
*length = reMatch.length();
return reMatch.position(0) + start;
}
*length = 0;
return O_NPOS;
}
**提升版**
size_t
ORegExpr::index_boost(const OString &inputStr, size_t* length, size_t start = 0) const {
if (start == O_NPOS)
return O_NPOS;
boost::regex re(_pattern);
boost::match_results<std::string::const_iterator> what;
boost::match_flag_type flags = boost::match_default;
std::string::const_iterator s = inputStr.std().begin() + start;
std::string::const_iterator e = inputStr.std().end();
if(boost::regex_search(s,e,what,re,flags)){
*length = what.length();
return what.position() + start;
}
*length = 0;
return O_NPOS;
}
**用std替换boost以查看是否使用插入器会有所不同**
size_t
ORegExpr::index_boostnowstd(const OString &inputStr, size_t* length, size_t start = 0) const {
if (start == O_NPOS)
return O_NPOS;
std::regex re(_pattern);
std::match_results<std::string::const_iterator> what;
//boost::match_flag_type flags = boost::match_default;
std::string::const_iterator s = inputStr.std().begin() + start;
std::string::const_iterator e = inputStr.std().end();
if(std::regex_search(s,e,what,re)){
*length = what.length();
return what.position() + start;
}
*length = 0;
return O_NPOS;
}
我尝试了各种方式来获取比赛的“数组”,并只返回第一场比赛的长度,但是对于我一生来说,我无法从boost中获得这一点。 它会返回两个匹配项以及两个匹配项的总长度,这是输入字符串的第一行和第二行。
如果我的解释不如我想象的那么充分,我将拥有功能齐全的POC。
我希望函数的输出返回size_t 46,这是输入字符串第一行的长度。 标准库可以做到这一点,但增强功能却没有。 增强的原因是,它似乎比标准库运行得更快。
您的正则表达式实际上匹配的是前两行,而不是单独的第一行。
尝试以下一项:
"[^\\\\n]+\\\\n\\\\n"
现场演示 (C ++ 03)
此正则表达式将匹配“没有换行符,后跟两个换行符”的首次出现,这将匹配输出的第一行,长度为46(包括换行符)
编辑:从您的评论看来,您被给定的表达卡住了。
您可以尝试使用Boost的match_flag_type
更改正则表达式的工作方式。 在这种情况下,使用boost::match_any
返回最左边的匹配。
boost::match_flag_type flags = boost::match_any;
从文档中找到match_any
:
指定如果可以进行多个匹配,那么任何匹配都是可接受的结果:这仍将找到最左侧的匹配,但可能找不到该位置的“最佳”匹配。 如果您关心匹配的速度,但不关心匹配的内容(仅是否有匹配项),请使用此标志。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.