我有可以由用户提供的表达式,例如:
a*sin(w*t)
a+b/c
x^2+y^2/2
我想只是获取那里的变量列表。我不需要做任何替换。所以,对于第一个公式,它将是{a,w,t}
。对于第二个{a,b,c}
,以及最后一个{x,y}
。
表达式主要是用Sympy编写的,但我需要能够在C ++中获取变量列表以进行一些检查。我想:
muparser
,但我不知道其中任何一个是否提供此功能最简单的方法是什么?你会如何解决这个问题?
答案 0 :(得分:2)
根据输入:const string input
我们可以使用regex收集或变量到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]
捕获任何以字母字符开头的内容\w*)
后跟任意数量的&#34;字&#34;字符(?:
指定我的非捕获可选匹配的开始[[^(a-zA-Z0-9_]
1 st 选项是非开括号\W
字符|$)
另一个选项是已达到输入的结尾