模式匹配数字字符串

时间:2016-01-23 22:27:27

标签: f# pattern-matching

我有一个模式匹配其参数的函数,即string

let processLexime lexime
    match lexime with
    | "abc" -> ...
    | "bar" -> ...
    | "cat" -> ...
    | _     -> ...

这可以按预期工作。但是,我现在试图通过表达“匹配仅包含以下字符的string来扩展它”。在我的具体示例中,我希望只包含数字的任何内容。

我的问题是,我怎样才能在F#中表达这一点?我更喜欢在没有任何库FParsec的情况下执行此操作,因为我主要是为了学习目的而这样做。

3 个答案:

答案 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