Ocaml中字符串的简单解析

Ulr*_*rar 0 ocaml

我不确定解决这个问题的最佳方法,所以我想我会问。我有这样的一行:

NAME="/dev/sda" TYPE="disk" MODEL="KINGSTON SV300S3"
Run Code Online (Sandbox Code Playgroud)

(从 lsblk 获得,有几个选项),我想尽可能简单地提取每个字段。是的,我知道 lsblk 有一个非常好的 --json,但不幸的是,这是最近添加的,我无法使用,我们有一些相当旧的服务器仍在生产中。

也许将 Str 与一些正则表达式一起使用?谷歌似乎经常说menhir,我从来没有使用过它,但我担心仅仅对于这样的几个变量来说可能有点重?我尝试过使用 String.split_on_char 和 String.slice,但是当模型包含空格时,它开始变得复杂, String.split_on_char 当然不会忽略双引号之间的空格。

oct*_*ron 6

对于像这样的简单格式,Scanf 模块可能是一个可行的替代方案:

let extract s = Scanf.sscanf s "NAME=%S TYPE=%S MODEL=%S" (fun x y z -> x, y ,z);;
;; extract {|NAME="/dev/sda" TYPE="disk" MODEL="KINGSTON SV300S3"|}
Run Code Online (Sandbox Code Playgroud)

产量

(“/dev/sda”、“磁盘”、“KINGSTON SV300S3”)

正如预期的那样。