如何在 OCaml 中删除字符串的所有字符
Posted
技术标签:
【中文标题】如何在 OCaml 中删除字符串的所有字符【英文标题】:How to delete all char of a string in OCaml 【发布时间】:2022-01-03 15:40:39 【问题描述】:有没有一种简单的方法可以删除 OCaml 字符串中所有出现的字符?
我想我可以使用这个干净的功能:
let clean =
function
| ' ' | '[' | ']' | '\n' | '>' -> ''
| x -> x
in
但是你不能在 OCaml 中使用''
。
所以我提出了这个解决方案:
let delete =
function
| ' ' | '[' | ']' | '\n' | '>' -> true
| _ -> false
in
let char_list, size =
String.fold_left
(fun (acc, count) c ->
if delete c then acc, count
else c::acc, count+1) ([],0) path_string
in
let char_list = ref @@ List.rev char_list in
let aux() =
match !char_list with
| [] -> failwith "unexpected"
| x :: xs -> char_list := xs; x
in
let cleaned_string = String.init size (fun _ -> aux()) in
cleaned_string
但它很大 - 使用 python 它只是 s.replace('>','')
来抑制一个 - 并且仅适用于我的安装不支持的 OCaml 4.13
。
【问题讨论】:
【参考方案1】:如果你想动态构建一个字符串,你应该使用一个缓冲区
let remove_chars erase s =
let b = Buffer.create 10 in
String.iter (fun c -> if not (erase c) then Buffer.add_char b c);
Buffer.contents b
(构建字符列表效率极低。)
【讨论】:
【参考方案2】:最接近 python 的可能是Str.global_replace
:
Str.(global_replace (regexp ">") "" s)
或一次执行多个字符,您可以执行以下操作:
Str.(global_replace (regexp "[youChar1yourChar2yourChar3]") "" s)
所以在你的情况下:
Str.(global_replace (regexp "[][> \n]") "" s)
【讨论】:
似乎现在您只需要一个"\"
就可以让正则表达式在这个在线编译器中工作:regex101.com。现在上面的程序在我这边不起作用:pastebin.com/90EwX5Qq。如果我尝试这个字符串"[ >\[\]\n]"
OCaml 会抛出一个错误
似乎 Str 正则表达式无法处理 ]
@glennsl
我阅读了this issue 并将当前的正则表达式替换为regexp |[][> \n]|
就可以了
这很奇怪。我看不出它如何能够在不转义分隔符的情况下分隔字符类。另一种选择是使用交替(\|
),但我认为您的解决方案更好。我会更新我的答案以改用它。
实际上我的解决方案没有删除,但 "[][> \n]" 有效 x)以上是关于如何在 OCaml 中删除字符串的所有字符的主要内容,如果未能解决你的问题,请参考以下文章