C++:提取解析数学表达式的 symbols/variables
C++: Extracting symbols/variables of an analytical mathematical expression
我有可以由用户提供的表达式,如:
a*sin(w*t)
a+b/c
x^2+y^2/2
我想 只是 获取那里的变量列表。我不需要做任何替换。因此,对于第一个公式,它将是 {a,w,t}
。第二个 {a,b,c}
,最后一个 {x,y}
。
表达式主要是为了用 Sympy 解析而编写的,但我需要能够在 C++ 中获取变量列表以进行一些检查。我愿意:
- 避免必须 link 整个 Python 解释器到我的程序
- 避免重新发明轮子,因为我看到有许多可用的解析库,例如
muparser
,但我不知道是否有任何一个提供此功能
最简单的方法是什么?你会如何解决这个问题?
给定输入: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*)
后跟任意数量的 "word" 个字符
(?:
指定我的非捕获可选匹配的开始
[[^(a-zA-Z0-9_]
1st 选项是一个非左括号 \W
字符
|$)
另一个选项是输入结束
我有可以由用户提供的表达式,如:
a*sin(w*t)
a+b/c
x^2+y^2/2
我想 只是 获取那里的变量列表。我不需要做任何替换。因此,对于第一个公式,它将是 {a,w,t}
。第二个 {a,b,c}
,最后一个 {x,y}
。
表达式主要是为了用 Sympy 解析而编写的,但我需要能够在 C++ 中获取变量列表以进行一些检查。我愿意:
- 避免必须 link 整个 Python 解释器到我的程序
- 避免重新发明轮子,因为我看到有许多可用的解析库,例如
muparser
,但我不知道是否有任何一个提供此功能
最简单的方法是什么?你会如何解决这个问题?
给定输入: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*)
后跟任意数量的 "word" 个字符(?:
指定我的非捕获可选匹配的开始[[^(a-zA-Z0-9_]
1st 选项是一个非左括号\W
字符|$)
另一个选项是输入结束