我有用户可以提供的表达式,例如:
a*sin(w*t)
a+b/c
x^2+y^2/2
我愿意just获取那里的变量列表。我不需要做任何替换。所以,对于第一个公式,它是{a,w,t}
。对于第二个{a,b,c}
,对于最后一个{x,y}
.
该表达式主要是为了用 Sympy 进行解析而编写的,但我需要能够获取 C++ 中的变量列表以进行一些检查。我想:
- 避免将整个 Python 解释器链接到我的程序
- 避免重新发明轮子,因为我看到有很多可用的解析库,例如
muparser
,但我不知道其中是否有提供此功能
做到这一点最简单的方法是什么?你会如何解决这个问题?
给定输入:const string input
我们可以收集或变量到set<string>
with a regex https://stackoverflow.com/a/38595708/2642059:
\b([a-zA-Z]\w*)(?:[^(a-zA-Z0-9_]|$) https://regex101.com/r/0hDJEZ/3
您可以在 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() };
Live Example http://ideone.com/OLkpJM
EDIT:
regex
解释:
-
\b
断言一个\W
字符或字符串的开头或结尾
-
([a-zA-Z]
捕获以字母字符开头的任何内容
-
\w*)
后跟任意数量的“word”字符
-
(?:
指定我的非捕获可选匹配的开始
-
[[^(a-zA-Z0-9_]
the 1st option is a non-open-parenthesis \W
character
-
|$)
另一个选项是已到达输入末尾
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)