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\([^(),]+\))"};
\B\([^(),]+\)
模式将匹配 (
,它位于字符串的开头或紧跟在非单词字符(字母、数字或 [=13 以外的字符)之后=]), [^(),]+
将消耗除 (
, )
和 ,
之外的 1 个或多个字符,然后 \)
将匹配一个 )
字符.
我尝试在 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\([^(),]+\))"};
\B\([^(),]+\)
模式将匹配 (
,它位于字符串的开头或紧跟在非单词字符(字母、数字或 [=13 以外的字符)之后=]), [^(),]+
将消耗除 (
, )
和 ,
之外的 1 个或多个字符,然后 \)
将匹配一个 )
字符.