1

JavaScriptとPHPを使用して分散計算機を開発しています。電卓は括弧を認識し、括弧に従って計算の順序を変更する必要があります。すべての基本的な数学演算(*、、、、 )/の優先度は同じ+です-(共通の優先度とは異なります)。次の正規表現を使用して、ユーザー入力を取得し、配列に配置します。この正規表現は、正の数に対して適切に機能します。

/\d*\.\d+|\d+|[()/*+-]/g

ただし、負の数になると、括弧(および内容)の各ペアをそれらの括弧内の操作の結果で置き換える再帰置換関数を使用するため、クラッシュします。これは分散計算機であり、サーバー側で各アトミック操作を実行してから結果を返し、操作の履歴に表示する必要があるためです。

私が欲しいのは、負の数を検出することです(それらを配列内の1つの要素としてのみ保存するため)。このように機能するはずです。2つの連続する演算子(間に空白文字が0個以上ある)があり、2番目の演算子がマイナス記号(-)の場合、マイナス記号は次の数値に連結する必要があります(番号の記号)。さらに、最初の数字の前にマイナス記号が付いている場合は、その数字に記号を連結する必要があります。

4

1 に答える 1

2

javascriptの正規表現の実装には後戻りがないため、これは最初に思われるほど簡単ではありません。

これはそれを行う1つの方法です。最初にスペースが削除されていることを前提としています。

var m,
    tokens = [],
    rex = /(^|[(\/*+-])(-(?:\d*\.)?\d+)|[()\/*+-]|(?:\d*\.)?\d+/g,
    str = '-4-(-2*3)--4-2/-0.9-3+(3-4*-4)';

while ( m = rex.exec( str ) ) {
    if ( m[1] ) {
        tokens.push( m[1], m[2] );
    } else {
        tokens.push( m[0] );
    }
}

console.log( tokens );
// [ "-4", "-", "(", "-2", "*", "3", ")", "-", "-4", "-", "2", "/", "-0.9", "-", "3", "+", "(", "3", "-", "4", "*", "-4", ")" ]

ここでは、後読みはキャプチャグループを使用してエミュレートされます()。文字列の先頭^またはm[1]負の数の前に演算子がある場合m[2]は、演算子と負の数がそれぞれ配列に追加されます。それ以外の場合-は、演算子として配列に追加されます。

または、

tokens = str.match( /(?:\d*\.)?\d+|[()\/*+-]/g );

次に、配列を反復処理し、-次の演算子が見つかった場合は、次の番号の前に追加します。

どちらの方法でも、単純な正規表現では文字列だけをトークン化することはできません。条件ステートメントを使用して、それぞれの処理方法を決定する必要があります-

于 2013-02-24T23:35:29.047 に答える