2017-11-28 24 views
1

私は先生(+、 - 、*、/をサポートする人)によって簡単な電卓を作成するように求められました。ユーザーの入力を受け取り、結果を出力する必要があります。それは永遠に実行し、最後に計算された結果を保存する必要があります。Fの正規表現が正規表現を使用しています

正規表現を使ってやりたいのですが、これについては最近紹介されていますが、どのように動作させるかを理解できません。 これは私が作成したものですが、動作しません。

let getInput() = 
    System.Console.Write ("give input: ") 
    let s = System.Console.ReadLine() 
    s 

let simpleCalc() = 
let numb1 = "[0-9]*" 
let numb2 = "[0-9]*" 
let operator = "[+-*/]" 
while true do 
    let s = getInput() 
    match s with 
     | "([0-9]*)([+-*/]?)([0-9]*)" [ int1; operator; int2 ] -> int1 operator int2 
     | _ -> printfn "thas no simple maf" 
+3

最初の '[+ - * /]'は、 '+'と '*'の間のASCII文字と一致するので、 '+、 - 。 '-'をエスケープするか、リストの先頭または最後に置く必要があります。 – ctwheels

+0

正規表現ではなくパターンマッチングを使用しているようです。どこかで 'System.Text.RegularExpressions.Regex'を使う必要があります。 – TheQuickBrownFox

+0

それらのお返事ありがとうございます。今私は自分のアイデアの2つを混ぜ合わせていることがわかります。最初にnumb1、numb2、operatorを定義する必要はありませんが、どのように構文を使用するのかは不明です。ここに助けがありますか?私は実際に何かのための最初の定義を使用しません。 –

答えて

1

コメントに記載されているとおり、正規表現をどこかで使用する必要があります。

open System.Text.RegularExpressions 

let (|Regex|_|) regex input = 
    let res = Regex.Match(input, regex) 
    if res.Success then Some (List.tail [for g in res.Groups -> g.Value]) 
    else None 

シンプル:あなたが書いたものに非常に近いですこれを行う1つの方法は、入力が与えられた正規表現にマッチし、リストとしてマッチしたグループを返した場合に成功し、アクティブパターンを定義することです基本的な算術演算のための評価者は、その後、として実装することができます。私たちは何とか呼び出すことができるF#関数にオペレータの文字列表現を有効にする必要があり

let s = "123*5" 
let ops = dict [ "+", (+); "-", (-); "*", (*); "/", (/)] 
match s with 
| Regex "([0-9]*)([\+\-\*\/])([0-9]*)" [left; op; right] -> 
    ops.[op] (int left) (int right) 
| _ -> -1 

注 - 私はdictを使用して、簡単なルックアップテーブルを定義しました。