【问题标题】:How to delete all char of a string in OCaml如何在 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

【问题讨论】:

    标签: string replace char ocaml


    【解决方案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)
      猜你喜欢
      • 2010-11-04
      • 2012-06-16
      • 2015-12-02
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2021-04-07
      • 2018-03-04
      • 2013-12-18
      相关资源
      最近更新 更多