簡體   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