我尝试在 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/