C++11 std::regex 后视替代方案

C++11 std::regex lookbehind alternative

我尝试在 C++11 中创建 class 来计算给出的数学公式 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)
exprTwo 匹配 pow(2,3)pow(2,4)
但问题在于 exprZero 它需要匹配 (2+3*4)(1+8),但它也匹配 sqrt(3)。在 Internet 上,我找到了 lookbehind (?<![a-z0-9]),但是 std::regex 没有我在 Internet 上找到的 lookbehind。有人建议使用 Boost.Regex,但我不想使用外部库。如果 std::regex 没有 lookbehind 你应该可以做类似的事情而不使用它?

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

这里有std::regex的模式吗?

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

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

regex demo

\B\([^(),]+\) 模式将匹配 ( ,它位于字符串的开头或紧跟在非单词字符(字母、数字或 [=13 以外的字符)之后=]), [^(),]+ 将消耗除 (, ), 之外的 1 个或多个字符,然后 \) 将匹配一个 ) 字符.