質問

こんにちは、数式内の不要な括弧を削除する既知の方法があるかどうか疑問に思っていました。私がこの質問をしている理由は、そのような式の長さを最小限に抑える必要があるためです

if((-if(([V].[6432])=0;0;(([V].[6432])-([V].[6445]))*(((([V].[6443]))/1000*([V].[6448])
+(([V].[6443]))*([V].[6449])+([V].[6450]))*(1-([V].[6446])))))=0;([V].[6428])*
((((([V].[6443]))/1000*([V].[6445])*([V].[6448])+(([V].[6443]))*([V].[6445])*
([V].[6449])+([V].[6445])*([V].[6450])))*(1-([V].[6446])));

これは基本的に SQL select ステートメントの一部です。255文字を上回ることができず、多くの括弧が役に立たないことがわかるので、この式(基本的にブラックボックス;)を生成するコードを変更することはできません。次の事実については言及していません。

((a) * (b)) + (c) = a * b + c

したがって、括弧、乗算/除算、加算/減算の演算順序を維持したいと考えています。

私は VB で作業していますが、どの言語でも問題ありません。

編集

逆の問題を見つけました(式に括弧を追加します) 質問.

これは大掛かりな解析を行わずに実現できると本当に思いました。しかし、式を調べて式ツリーに保存するパーサーの登場は避けられないようです。

役に立ちましたか?

解決

あなたは最も簡単な例を取り除くことができます:

([V].[6432]) and (([V].[6443]))

になります。

v.[6432]

あなたは[]の周りのテーブル名またはそのエイリアスを必要はありません。

あなたが列を別名設定できる場合は、

あなたはそれをさらに短縮することができます:

select v.[6432] as a, v.[6443] as b, ....

または単一のサブクエリに照会されるすべてのテーブルを置く - そして、あなたはテーブルプレフィックスを必要としない。

if((-if(a=0;0;(a-b)*((c/1000*d
+c*e+f)*(1-g))))=0;h*
(((c/1000*b*d+c*b*
e+b*f))*(1-g));

select [V].[6432] as a, [V].[6445] as b, [V].[6443] as c, [V].[6448] as d, 
    [V].[6449] as e, [V].[6450] as f,[V].[6446] as g, [V].[6428] as h ...

これは明らかに、すべてのビットpsedoコードですが、それはあなたが完全な文を簡素化する必要があります。

他のヒント

式内の不要な括弧を削除したい場合の一般的な解決策は、テキストを解析し、関連する式ツリーを構築することです。

次に、いくつかのルールを適用することで、このツリーから、不要な括弧なしで対応するテキストを見つけることができます。

  • ノードが「+」の場合、括弧は必要ありません
  • ノードが「*」の場合、左(右)の子が「+」の場合にのみ、左(右)の子に括弧が必要です。
  • 「/」についても同様です

ただし、これら 255 文字を処理するだけの問題であれば、おそらく中間変数を使用して中間結果を保存するだけで済みます。

T1 = (([V].[6432])-([V].[6445]))*(((([V].[6443]))/1000*([V].[6448])+(([V].[6443]))*([V].[6449])+([V].[6450]))*(1-([V].[6446])))))
T2 = etc...

私はこのスレッドは本当に古いですが、それはグーグルから検索可能であると知っています。

私は同様の問題に対処TI-83プラス電卓プログラムを書いています。私の場合、私は実際には数の特定の変数のための方程式を解くためにしようとしているが、私は、配列を使用していますが、それはまだ、自分の問題に関連することができるので、私が特定の値を選び出すしやすいかもしれません。 ..
これはかなり行われていないが、それは(私が思う)と括弧の大半、ややエレガントなソリューションを取り除くん。

私は式/機能をスキャンされない何

/何でも、各開口Parentheseのを追跡する「(」私は決算Parentheseのを見つけるまで、「)」、私はいずれにも実行されないことを保証することができ、その時点でより深くParentheseのネストます。

Y =((3X +(2)))を示すであろう(2)第一、次いで(3X +(2))、次いで((3X + 2)))。

それは、その後のチェック値をすぐに各Parentheseの前と後ではどのような。上記の場合、それは+と)返します。これらのそれぞれは、数値が割り当てられます。彼ら二人の間には、高いが使用されています。何の演算子が見つからない場合(*、/、+、^、または - )。私は0の値にデフォルト設定

次は、私は括弧内をスキャンします。この場合には、私はない、最高のを発見した最も低い値を使用するが、私は、同様の番号付けシステムを使用しています。何も見つからない場合は、上記の場合のだろうと、私は、5の値にデフォルト設定ます。

アイデアは、あなたが2つの値を差し引くことにより、括弧の重要性に番号を割り当てることができるということです。あなたは^括弧の外側にのようなものを持っている場合 (+ 3 2)^ 5 これらの括弧は、潜在的に非常に重要であり、価値の高い、(私のプログラムでは、私は^のために5を使用)を与えられることになります。

これは、内部のオペレータは括弧が非常に重要でないレンダリングということは可能です (2)^ 5 何も見つからなかったところ。その場合、内側2つの値を減算することによって5の値を割り当てられる、あなたは、単に得られた数(2の場合には0よりも大きいか否かをチェックすることによって、括弧のセットがneccessaryであるか否かを判断することができます+3)^ 5、A ^ 5の値を与える、とA +は括弧が実際に必要であることを示すであろう結果の数が4であろう1の値を与えるであろう。 (2)^ 5あなたが得られ、5の内側値と5の外側の値を有するであろう場合に 0の最終値で、括弧は重要であり、除去することができることを示す。

これの欠点は走査(少なくともTI-83で)式を介して非常に多くの時間が途方もなく遅い、ということです。しかし、速度が問題にされていない場合は... それがすべてで役立つ場合、私は完全にオフトピックかもしれないが、知ってはいけません。あなたはすべてを持って作業を願っています。

私は、括弧は不要であるかを決定するために、あなたがそれらの中に式を評価するには、のHAVE をすることをかなり確信しています。あなたが巣の括弧をすることができるので、これは正規表現のみの浅い方法で対処できるという再帰的な問題の一種である、と誤った結果に最も可能性が高いです。すでに式を評価している場合は、多分あなたは、可能な場合には式を簡素化したいと思います。これも一種のトリッキー取得し、いくつかのアプローチでは、そのようなあなたは、以下の論文に見るかもしれないとしても、機械学習に見られる技術を使用しています:<のhref = "http://portal.acm.org/citation.cfm ?ID = 1005298" のrel = "nofollowをnoreferrer"> http://portal.acm.org/citation.cfm?id=1005298 の

あなたの変数名は、次の1つのクエリから大きく変化していない場合は、

、あなたは交換してください()一連のコマンドを試みることができます。すなわちます。

X=replace([QryString],"(([V].[6443]))","[V].[6443]")

また、なぜそれが255文字を超えることはできませんか?あなたはAccessテーブルに文字列フィールドとしてこれを保存している場合、あなたは別で1つのフィールドと後半の半分の表現を入れてみてください可能性があります。

またANTLR、YACCまたは類似を使用して式を解析しようとして解析ツリーを作成することができます。これらの木は通常、離れ括弧を最適化します。次に、あなただけの(明らかに括弧なし)バックツリーから式を作成する必要があります。

これは、しかし、この作業を取得するためにいくつかのより多くの時間よりもあなたがかかる場合があります。しかし、表現の構文解析は、通常、一般的な構文解析上の最初の例であるので、あなたは、サンプルを取り、あなたのニーズに合わせて変更することができるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top