3

matchを使用して、数式を別々の文字列に分割し、それらを配列に保存します。

var STRING = ST.match(/\d*\.\d+|\d+|[()/*+-]/g);

ただし、このメソッドは、括弧内にある負の数を含むすべてを区切ります。たとえば、(-2 + 4)は-2を与えませんが、代わりに、STRING配列の1つのインデックスに-を保存し、次のインデックスに2を保存します。とにかく一致を使用して、括弧内にある負の数を保存しますか?

これが私が欲しいものです:(-2 + 4):

STRING[0] give me (
STRING[1] give me -2
STRING[2] give me +
STRING[3] give me 4
STRING[4] give me )

負の数がない場合は通常どおりに機能します:(2 + 4):

STRING[0] give me (
STRING[1] give me 2
STRING[2] give me +
STRING[3] give me 4
STRING[4] give me ) 
4

4 に答える 4

2

"(-2+4*-(3.5--8))"特にJavaScriptで否定的な後ろ向きがないことを考えると、正規表現だけのような複雑なケースを解析することは不可能だと思います。

解決策は、区切り記号と符号なし式の間にある符号をマージして、一致配列を後処理することです。

私の意見では、ここでは正規表現が役に立ちますが、それは主要なトークン化に限られます。バイナリ表現ツリー (または選択したその他の正式な表現) を構築するため、ほとんどの作業は先に行われます。

于 2013-02-20T07:46:12.380 に答える
0

残念ながら、あなたがしようとしているのが数式の解析である場合、正規表現は使用できません。

正規表現は、通常の文法で記述できる言語で使用できますが、算術式は記述できません。これらは Context Free Grammar ( CFG ) で記述されます。結果を解析し、おそらく解釈したい場合は、スタックされた状態マシンが必要になることは間違いありません。

このよく知られたアルゴリズムのようなものを見ることができます。

お役に立てれば。

于 2013-02-20T07:57:09.247 に答える
0

RegExp に間違いがあると思います。これを試してみてください。私にとってはうまくいきます。

var STRING = ST.match(/(\d*)(\.)(\d+)|(\d+)|[()\/*+-]/g);
于 2013-02-20T08:27:40.140 に答える
0

数字にオプションの記号を追加できます。これは、例で機能します。

var STRING = ST.match(/-?\d*\.\d+|-?\d+|[()/*+-]/g);

ただし、マイナス演算子も記号に変わります。式(4-2)はあなたに与えるでしょう{ "(", "4", "-2", ")" }

+---((((***また、文句を言わずに式を喜んで「解析」します。意味のある結果が必要な場合は、正規表現で分割するだけでなく、実際に解析する必要があります。

于 2013-02-20T07:58:50.250 に答える