C++11 std::regex Lookbehind 替代方案

标签 c++ regex lookbehind

我尝试在 C++11 中创建类来计算以 std::string 形式给出的数学公式。

std::string formula = "sqrt(3)+15*3*(2+3*4)+pow(2,3)+(2*(1+8))-(3*(1+pow(2,4)))";

我决定使用 std::regex 来搜索模式,获取它们,计算它们并用计算结果替换它们。为了计算这个公式,我制作了 3 种模式。

std::regex exprOne{ "[a-zA-Z0-9]+\\([^(),]+\\)" };
std::regex exprTwo{ "[a-zA-Z0-9]+\\([^()]+\\)" };
std::regex exprZero{ "(?![a-z0-9])\\([^(),]+\\)" };

exprOne 匹配 sqrt(3)
expr两个匹配 pow(2,3)pow(2,4)
但问题在于 exprZero 它需要匹配 (2+3*4)(1+8) ,但它匹配 sqrt(3)也。在互联网上我发现了lookbehind (?<![a-z0-9]) ,但是 std::regex 没有我在互联网上发现的向后查找功能。有些人建议使用 Boost.Regex,但我不想使用外部库。如果 std::regex 没有lookbehind,你应该能够在不使用它的情况下做类似的事情?

exprZero 不应匹配 sqrt([^(),]+) , log([^(),]+) , log10([^(),]+)等等,但应该匹配 ([^(),]+) .

这是 std::regex 中的模式吗?

最佳答案

您可以在此处使用非单词边界:

std::regex exprZero{R"(\B\([^(),]+\))"};

请参阅regex demo

\B\([^(),]+\) 模式将匹配位于字符串开头或非字符串之后的 ( -word char(除字母、数字或_之外的字符),[^(),]+将消耗除(, ),,然后 \) 将匹配 ) 字符。

关于C++11 std::regex Lookbehind 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58574364/

相关文章:

C++ Lua 5.1 问题

javascript - 如果 `q` 内不是 `\q`,则正则表达式在 `<>` 上拆分

python - 如何创建一个返回嵌入记录中的值的函数?

Java 正则表达式 后向查找

java - 多次匹配后视/前视

c++ - 如何正确使用 peek(),或者是否有更好的解决方案来读取文本文件?

c++ - MISRA C++(规则 18-4-1)和动态内存分配 - 是否允许 std::string?

Visual Studio 中的 C++ 头文件

python - 在Python中从字符串中提取多个段

.net - 使用正则表达式进行搜索和替换(包括lookbehinds)在 VS2017 中不起作用