繁体   English   中英

C ++ Boost正则表达式与标准库正则表达式匹配结果

[英]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

指定如果可以进行多个匹配,那么任何匹配都是可接受的结果:这仍将找到最左侧的匹配,但可能找不到该位置的“最佳”匹配。 如果您关心匹配的速度,但不关心匹配的内容(仅是否有匹配项),请使用此标志。

演示#2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM