C :提取分析数学表达式的符号/变量

C++: Extracting symbols/variables of an analytical mathematical expression

本文关键字:表达式 符号 变量 提取      更新时间:2023-10-16

i具有用户可以提供的表达式,例如:

 a*sin(w*t) 
 a+b/c
 x^2+y^2/2

我想在那里获取变量列表。我不需要做任何替代。因此,对于第一个公式,它将是{a,w,t}。对于第二个{a,b,c},以及最后一个{x,y}

该表达式主要是用Synpy解析的,但是我需要能够在C 中获取变量列表以进行某些检查。我想:

  • 避免将整个Python解释器链接到我的程序
  • 避免重新发明轮子,因为我看到有许多可用的解析库,例如muparser,但我不知道这些功能是否提供此功能

最简单的方法是什么?您将如何解决此问题?

给定输入: const string input我们可以用正则 set<string>收集或变量:

b([a-zA-Z]w*)(?:[^(a-zA-Z0-9_]|$)

您可以在C 中使用它如下:

const regex re{ "\b([a-zA-Z]\w*)(?:[^(a-zA-Z0-9_]|$)" };
const set<string> output{ sregex_token_iterator(cbegin(input), cend(input), re, 1), sregex_token_iterator() };

实时示例

编辑:

regex说明:

  • b断言W字符或字符串的开始或结尾
  • ([a-zA-Z]捕获以字母charachter开头的任何东西
  • w*),然后是任意数量的"单词"字符
  • (?:指定我的非捕捉可选匹配的开始
  • [[^(a-zA-Z0-9_] 1 st 选项是非打开 - 段的W字符
  • |$)另一个选择是已达到输入的末尾