3

次のような、ユーザーが提供できる式があります。

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

そして、そこにある変数のリストを取得したいと思います。代用する必要はありません。したがって、最初の式は になります{a,w,t}。2 つ目{a,b,c}と最後の 1 つ{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​​文字です
  • |$)もう1つのオプションは、入力の終わりに達したことです
于 2016-12-06T15:11:41.167 に答える