3

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

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

我想在那里得到变量列表。我不需要做任何替换。所以,对于第一个公式,它将是{a,w,t}. 对于第二个{a,b,c},最后一个{x,y}

该表达式主要编写为使用 Sympy 解析,但我需要能够获取 C++ 中的变量列表以进行一些检查。我想:

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

最简单的方法是什么?你将如何解决这个问题?

4

1 回答 1

2

给定输入:我们可以使用正则表达式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() };

Live Example

编辑:

regex解释:

  • \b断言一个\W字符或字符串的开头或结尾
  • ([a-zA-Z]捕获以字母字符开头的任何内容
  • \w*)后跟任意数量的“单词”字符
  • (?:指定我的非捕获可选匹配的开始
  • [[^(a-zA-Z0-9_]第一个选项是非开括号\W字符
  • |$)另一种选择是已经到达输入的结尾
于 2016-12-06T15:11:41.167 回答