0

Javascriptで電卓をコーディングしています。

[expression1]^[expression2]:を :に翻訳したいMath.pow([expression1], [expression2])

のような単純な式5^-3がある場合、正規表現を使用するのは非常に簡単ですが、次のようなより複雑な式がある場合:

(-5*(6+3)-5)^((2*2)-2)+(4*5)

括弧がネストされているため、正規表現で処理する方法がわかりません...

何かアドバイス?ありがとう。

4

2 に答える 2

3

正規表現パターンを使用します。

/((?:(?=[^()]*\d)\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))\^((?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))/

このフィドルを確認してください。


説明:

[ステップ1]::正規表現パターンには、2つのほぼ同じサブパターンが含まれています^

((?:(?=[^()]*\d)\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))
\^
((?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)|(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\)))

唯一の違いは、2番目(後ろ^)では単純なパラメーターとして負の数を使用できることです(\-?

[ステップ2]::ステップ1のサブパターンには2つの選択肢があります。

(?:(?=[^()]*\d)\-?\d*(?:\.\d*)?)
|
(?:\((?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)\))

[ステップ3]::最初の選択肢は数字です-例:1234または12.34または1234.または.1234

(?=[^()]*\d)
\-?\d*
(?:\.\d*)?

[ステップ4]::2番目の選択肢は、ネストされた括弧式です

\(
(?:(?:[^()]+)|(?:[^()]*\([^()]*\)[^()]*)+)
\)

[ステップ5]::これは単純または複雑である可能性があります(内部に他の括弧があります)

(?:[^()]+)
|
(?:[^()]*\([^()]*\)[^()]*)+

[ステップ6]::複雑で、中に他の括弧がある場合は、ネストされていることを確認します

[^()]*
\(
[^()]*
\)
[^()]*
于 2012-09-03T18:48:54.123 に答える