2017-05-08 7 views
1

機能的アプローチを使用して正規表現を行うにはどうすればよいですか?現在のところ、ユーザーは入力をしたいと思いますが、大文字で入力しても応答はありますか?私はこれを実装する方法がわかりません。正規表現f#

open System 
open System.Drawing 
open System.Windows.Forms 

let (|Hello|Bye|None|) input = 
match input with 
    | "hello" | "hi" | "morning" 
      -> Hello 
    | "Goodbye" | "bye" | "go" 
      -> Bye 
    | _  
      -> None 

    let rand = new Random() 

    let hello_response() = 
    let n = rand.Next(10) 
    match n with 
    | 0 -> "How do you do." 
    | 1 -> "Is nice talking to you." 
    | 2 -> "Tell me something new." 
    | 3 -> "Nice to meet you." 
    | 4 -> "My pleasure." 
    | 5 -> "Hi." 
    | 6 -> "Hello." 
    | 7 -> "Good day." 
    | 8 -> "Salutation!" 
    | 9 -> "Welcome!" 


    let good_bye_response() = 
    let n = rand.Next(10) 
    match n with 
    | 0 -> "Talk to you soon." 
    | 1 -> "It was nice talking to you." 
    | 2 -> "Good bye." 
    | 3 -> "Stay a bit longer." 
    | 4 -> "Adios amigo." 
    | 5 -> "Bye." 
    | 6 -> "Adios." 
    | 7 -> "See you." 
    | 8 -> "Please don't go" 
    | 9 -> "Why are you leaving me alone?" 

    let none_response (str:string) = 
    let n = rand.Next(10) 
    match n with 
    | 0 -> "Maybe." 
    | 1 -> "Perhaps " + str 
    | 2 -> "Yes." 
    | 3 -> "Ah!" 
    | 4 -> "Whatever." 
    | 5 -> "Sorry, the chat closed unexpectedly. What was your last 
    question?" 
    | 6 -> "Where were we? I losed track of the conversation." 
    | 7 -> "Very interesting" 
    | 8 -> "Wow!" 
    | 9 -> "Mmmmmm!" 

    let rec response (token: string) (str: string) = 
    match token with 
    | Hello 
     -> hello_response() 
    | Bye 
     -> good_bye_response() 
    | "" 
     -> none_response str 
    | None when (str.IndexOf(" ") > 0) 
     -> response (str.Substring(0,str.IndexOf(" "))) 
    (str.Substring(str.IndexOf(" ")+1)) 
    | None when (str.IndexOf(" ") < 0) 
     -> response str "" 
    | None 
     -> str 

    let marketbot_resp (str: string) = 
    if (str.IndexOf(" ") > 0) then 
    response (str.Substring(0,str.IndexOf(" "))) 
    (str.Substring(str.IndexOf(" ")+1)) + "\n" 
    else 
    response str "" + "\n" 
+0

MSDNでドットネットの正規表現の例をチェックして、f#タブがあるかどうかを確認します。これについてはわかりませんが、ドットネット正規表現はすべての言語で(つまり、そういう意味で)使われるべきです。 – sln

答えて

1

F#の正規表現は、C#またはVB.NET(または他の.NET言語)とまったく同じ方法で使用できます。 MSDNは、この件に関する非常に詳細な文書を提供しています。 Check it out

ルートクラスはSystem.Text.RegularExpressions.Regexです。一致する最も簡単な方法は、IsMatch静的メソッドを介してである:

let (|Hello|Bye|None|) input = 
    if Regex.IsMatch(input, "(?i)hello|hi|morning") then Hello 
    elif Regex.IsMatch(input, "(?i)goodbye|bye|go") then Bye 
    else None 

ます。またRegexのインスタンスを作成し、それを再利用することで、正規表現を「キャッシュ」することができます。これにより、パフォーマンスが少し向上します。

let (|Hello|Bye|None|) = 
    let hello = Regex "(?i)hello|hi|morning" 
    let bye = Regex "(?i)goodbye|bye|go" 
    fun input -> 
     if hello.IsMatch input then Hello 
     elif bye.IsMatch input then Bye 
     else None 

しかし、この特定のタスクでは、正規表現は過度のものだと思います。一致する前に文字列を小文字に変換するだけです:

let (|Hello|Bye|None|) (input: string) = 
    match input.ToLower() with 
    | "hello" | "hi" | "morning" 
      -> Hello 
    | "goodbye" | "bye" | "go" 
      -> Bye 
    | _  
      -> None