我有一个模式匹配其参数的函数,即string
:
let processLexime lexime
match lexime with
| "abc" -> ...
| "bar" -> ...
| "cat" -> ...
| _ -> ...
这可以按预期工作。但是,我现在试图通过表达“匹配仅包含以下字符的string
来扩展它”。在我的具体示例中,我希望只包含数字的任何内容。
我的问题是,我怎样才能在F#中表达这一点?我更喜欢在没有任何库FParsec
的情况下执行此操作,因为我主要是为了学习目的而这样做。
答案 0 :(得分:3)
您可以使用有效模式:https://msdn.microsoft.com/en-us/library/dd233248.aspx
let (|Integer|_|) (str: string) =
let mutable intvalue = 0
if System.Int32.TryParse(str, &intvalue) then Some(intvalue)
else None
let parseNumeric str =
match str with
| Integer i -> printfn "%d : Integer" i
| _ -> printfn "%s : Not matched." str
答案 1 :(得分:2)
一种方式是活动模式
let (|Digits|_|) (s:string) =
s.ToCharArray() |> Array.forall (fun c -> System.Char.IsDigit(c)) |> function |true -> Some(s) |false -> None
然后你可以做
match "1" with
|Digits(t) -> printf "matched"
答案 2 :(得分:1)
我会将正则表达式与活动模式结合使用。使用正则表达式,您可以轻松地将数字与\d
匹配,并且活动模式可以使match
内的语法更好。
open System.Text.RegularExpressions
let (|ParseRegex|_|) regex str =
let m = Regex("^"+regex+"$").Match(str)
if (m.Success) then Some true else None
let Printmatch s =
match s with
| ParseRegex "w+" d -> printfn "only w"
| ParseRegex "(w+|s+)+" d -> printfn "only w and s"
| ParseRegex "\d+" d -> printfn "only digis"
|_ -> printfn "wrong"
[<EntryPoint>]
let main argv =
Printmatch "www"
Printmatch "ssswwswwws"
Printmatch "134554"
Printmatch "1dwd3ddwwd"
0
打印
only w
only w and s
only digis
wrong