我想匹配f#中字符串的开头。不知道我是否必须把它们当作一个字符列表或什么。任何建议,将不胜感激。f中字符串开头的模式匹配#
这里是什么,我试图做
let text = "The brown fox.."
match text with
| "The"::_ -> true
| "If"::_ -> true
| _ -> false
所以,我想看看绳子,比赛开始一个伪代码版本。请注意,我在上面列出的字符串列表中不匹配,作为我尝试做的本质的一个想法。
我想匹配f#中字符串的开头。不知道我是否必须把它们当作一个字符列表或什么。任何建议,将不胜感激。f中字符串开头的模式匹配#
这里是什么,我试图做
let text = "The brown fox.."
match text with
| "The"::_ -> true
| "If"::_ -> true
| _ -> false
所以,我想看看绳子,比赛开始一个伪代码版本。请注意,我在上面列出的字符串列表中不匹配,作为我尝试做的本质的一个想法。
参数化active patterns来救援!
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"
是的,如果您想使用匹配表达式,您必须将它们视为字符列表。
let text = "The brown fox.." |> Seq.toList
然后你可以用一根火柴的表达,但你将不得不使用字符(元素的列表中的类型),对每个字母:
match text with
| 'T'::'h'::'e'::_ -> true
| 'I'::'f'::_ -> true
| _ -> false
只需用变换字符串
由于布赖恩建议参数化主动模式更好,有一些有用的模式here(去页面的结尾)。
你也可以使用保护上的图案:
match text with
| txt when txt.StartsWith("The") -> true
| txt when txt.StartsWith("If") -> true
| _ -> false
这也是一个很好的例子,特别是如果你想在包含=和参数的开关上部分匹配。 – octopusgrabbus 2017-06-28 17:19:46
+1。我们希望学习的主动模式的一个很好的例子! – 2010-09-15 23:45:47
这个答案有一个可爱的应用组合主动模式字符串匹配:http://stackoverflow.com/questions/3686199/f-pattern-composition/3686555#3686555 – 2010-09-16 00:52:52
这个答案是太棒了,但我必须承认我flummoxed 。匹配表达式中的“休息”值来自哪里? – 2015-11-29 20:44:40