C ++ Boost regex与标准库regex匹配结果

时间:2019-07-15 14:16:15

标签: c++ boost c++-standard-library

很难以与标准库相同的方式获得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,这是输入字符串第一行的长度。标准库可以做到这一点,但增强功能却没有。增强的原因是它的运行速度似乎比标准库快。

1 个答案:

答案 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的文档:

  

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

Demo #2