很难以与标准库相同的方式获得boost regex匹配结果。意味着标准库在产生多个匹配项的多行输入中返回第一个匹配项。
目标是在运行此代码的产品遇到很多问题时获得最佳性能。子字符串调用非常慢,因此是提高工作效率的方法。
此产品在C ++ 11之前的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,这是输入字符串第一行的长度。标准库可以做到这一点,但增强功能却没有。增强的原因是它的运行速度似乎比标准库快。
答案 0 :(得分:0)
您的正则表达式实际上匹配的是前两行,而不是单独的第一行。
尝试以下方法:
"[^\\n]+\\n\\n"
Live Demo(C ++ 03)
此正则表达式将匹配首次出现的“没有换行符,后跟两个换行符”,这将匹配输出的第一行,长度为46(包括换行符)
编辑: 在您的评论中,您似乎迷上了给定的表达式。
您可以尝试使用Boost的match_flag_type
来更改正则表达式的工作方式。在这种情况下,请使用boost::match_any
返回最左边的匹配项。
boost::match_flag_type flags = boost::match_any;
来自match_any
的文档:
指定如果可以进行多个匹配,那么任何匹配都是可接受的结果:这仍将找到最左侧的匹配,但可能找不到该位置的“最佳”匹配。如果您关心匹配的速度,但不关心匹配的内容(仅是否匹配),请使用此标志。