有没有办法“匹配”以某个值开头的字符串? [重复]

问题描述 投票:0回答:2

例如,考虑以下表达式:

match string with
| "Foo " ^ rest -> rest
| "Bar " ^ rest -> rest
| _ -> "unmatched"

不幸的是,这是一个语法错误。有什么方法可以实现这种行为吗?

ocaml
2个回答
4
投票

字符串的 OCaml 函数参数模式匹配中有一些解释,解释了为什么无法在模式匹配中解构字符串。您只能匹配纯字符串。

相反,您可以使用新的

String.starts_with
(OCaml 4.13) 将字符串与固定前缀进行比较,或者使用提供正则表达式的
Str
模块,或者将字符串转换为列表并匹配那个清单。


3
投票

另一种可能性是拆分进入匹配的字符串,以便您可以基于普通旧字符串的元组进行匹配。

String.(
  match sub s 0 4, sub s 4 (length s - 4) with 
  | "foo ", rest -> ...
  | "bar ", rest -> ...
  | _ -> ...
)

如果您创建一个函数来根据一定数量的字符对字符串进行分区,这会变得更好看。

let part s n =
  String.(sub s 0 n, sub s n (length s - n))

现在:

match part s 4 with 
| "foo ", rest -> ...
| "bar ", rest -> ...
| _ -> ...

如果我们不使用模式匹配,这可能看起来像:

let (first, rest) = part s 4 in
if first = "foo " then ...
else if first = "bar " then ...
else ...
© www.soinside.com 2019 - 2024. All rights reserved.