在f#中的string的开始模式匹配
我想在f#中匹配string的开头。 不知道是否我必须把它们当作一个字符列表或什么。 任何build议,将不胜感激。
这是我正在尝试做的一个伪代码版本
let text = "The brown fox.." match text with | "The"::_ -> true | "If"::_ -> true | _ -> false
所以,我想看看string和匹配的开始。 注意我没有匹配的string列表只是写上述作为我想要做的本质的想法。
参数化的活动模式来拯救!
let (|Prefix|_|) (p:string) (s:string) = if s.StartsWith(p) then Some(s.Substring(p.Length)) else None match "Hello world" with | Prefix "The" rest -> printfn "Started with 'The', rest is %s" rest | Prefix "Hello" rest -> printfn "Started with 'Hello', rest is %s" rest | _ -> printfn "neither"
是的,如果你想使用匹配expression式,你必须把它们当成一个字符列表。
简单地转换string:
let text = "The brown fox.." |> Seq.toList
然后你可以使用匹配expression式,但是你必须为每个字母使用字符(列表中的元素的types):
match text with | 'T'::'h'::'e'::_ -> true | 'I'::'f'::_ -> true | _ -> false
正如布赖恩build议参数化主动模式更好,这里有一些有用的模式(走到页面的末尾)。
你也可以在模式上使用警卫:
match text with | txt when txt.StartsWith("The") -> true | txt when txt.StartsWith("If") -> true | _ -> false