gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:24 28 4
gpt4 key购买 nike

难以使 boost 正则表达式匹配结果以与标准库相同的方式出现。这意味着标准库会返回产生多个匹配项的多行输入中的第一个匹配项。

目标是获得最佳性能,因为运行此代码的产品对它的影响很大。子字符串调用非常慢,因此是 boost 处理方式的方法。

此产品是 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;
}

** 将 boost 替换为 std 以查看使用交互器是否会有所作为 **

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。

我希望函数的输出返回 46 的 size_t,这是输入字符串第一行的长度。标准库会这样做,但 boost 不会。 boost 的原因是它似乎比标准库运行得更快。

最佳答案

您的正则表达式实际上匹配前两行,而不是单独的第一行。

试试这个:

[^\\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 的文档:

Specifies that if more than one match is possible then any match is an acceptable result: this will still find the leftmost match, but may not find the "best" match at that position. Use this flag if you care about the speed of matching, but don't care what was matched (only whether there is one or not).

Demo #2

关于C++ Boost 正则表达式与标准库正则表达式匹配结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041692/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com