2016-04-22 9 views
3

私は評価する必要がある表現が代わりに括弧を使用してこのようなものになります高度な検索機能に取り組んでいます:私たちが見ればC#でカスタム括弧の式を評価する方法は?

((Loan number is 1000 And 
Lock Date is less than 12/03/2015) Or 
Borrower SSN contains 12345) And 
((Buy date is between 12/01/2015 and 23/02/2016 And 
APR is less than 20000) Or 
Loan amount is greater than 60000) 

または単純な言葉で

((condition1 And condition2) Or condition 3) And ((condition4 And condition5) Or condition6). 

を括弧、条件1および条件2を最初に評価し、次にこれの出力を条件3などで実行する必要があります。

一度に2つの条件を評価するAPIがあります。しかし、この文脈での挑戦は

1)どのように対応するかっこを特定し、最初にそれらを評価するかです。そして、この中間結果をさらに評価するために使用しますか?

2)使用されていない括弧はどのように見つけるのですか?たとえば、(((条件1と条件2))))、この場合は必須ではありませんが、3つの開始括弧と3つの閉じ括弧が有効な式です。

私はいくつかのアルゴリズムherehere

を発見しようとしたが、これは一度に一つの文字を読み取り、それをコンピュータが理解できる算術式の評価であるトークンベースの操作を要します。私の場合、これらのことはカスタムであり、これを行うアルゴリズムを見つけるべきです。誰も私のシナリオのより良いアプローチを提案することができますか?

+1

私は式ツリーをあなたのAPIと一緒に使っています(または、表現木を自分で作成したくない場合はlinqkitを使用します)。 –

+1

あなたの式にパーサーが必要です。作成方法は次のとおりです。http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-usable-on-8-bit-embedded-systems/2336769# 2336769この記事では、後で評価できるようにツリーを構築する方法や、解析されたときに式を評価する方法について説明します。 –

+0

shunting-yardアルゴリズムを使うと、中置の表記法を後の表記法に変換することができます。これらの記事のように結果を評価できますが、ASTやAPIに必要なフォーマットに変換することもできます。だから...あなたのAPIにはどんなフォーマットが必要ですか? –

答えて

2

私が正しく理解していれば、すでにエクスプレッションエバリュエーターが得られています。あなたが必要とするのは、かっこに従って評価を分割することです。その後、見つかった場合は、あなたの評価ルーチンの結果に置き換えて

\(([^()]*)\) 

、最終的な文字列が残るまで繰り返します。私は、この正規表現を使用して、私は内側のカッコのグループを見つけるだろうしたループを、使用したいです、括弧なし。

擬似コード:未使用括弧について

Find a string enclosed by(), not containing any() 
If found 
    Replace it with the evaluated value of the string (including parenthesis) 
    Go again 
Return result 

は、彼らが同じように扱われてみましょう。それらはあなたの評価ルーチンで単一の値として終了します。

Check this fiddle。それを評価する代わりに、乱数、0または1を返しますが、それはロジックを示しています。

これが役に立ちます。

よろしくお願いいたします。

+1

私の意見では、正規表現は構文的再帰式を解析するためのものではありません。たとえば、(部分的に)文字列を選択することはできますが、エラーを伝える評価は何もありません。 –

+0

@JacekCz私は(ある程度、簡単な評価作業のために正規表現を使用します)私は同意します。私がここで提案した解決策は、評価のために正規表現を使用しません。単に**評価が必要な部品を特定します**。 – ClasG

+0

ありがとうClas、私のためのベースを設定します。 – user3796454

関連する問題