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