【问题标题】:How do I strip whitespace from a string in OCaml?如何从 OCaml 中的字符串中去除空格?
【发布时间】:2010-12-07 18:31:14
【问题描述】:

为了学习 OCaml 的基础知识,我正在使用它解决一个简单的facebook engineering puzzles。本质上,我想做类似下面的 Python 代码:

some_str = some_str.strip()

也就是说,我想去掉开头和结尾的所有空格。我在 OCaml Str 库中看不到任何明显的做法。有什么简单的方法可以做到这一点,或者我将不得不编写一些代码来做到这一点(我不介意,但不想这样做:))。

请记住,我仅限于 OCaml 发行版附带的库中的内容。

【问题讨论】:

    标签: string ocaml


    【解决方案1】:

    我知道这个问题已经过时了,但我只是在思考同样的事情并想出了这个(来自顶层):

    let strip str = 
      let str = Str.replace_first (Str.regexp "^ +") "" str in
      Str.replace_first (Str.regexp " +$") "" str;;           
    val strip : string -> string = <fun>
    

    然后

    strip "   Hello, world!   ";;
    - : string = "Hello, world!"
    

    更新:

    从 4.00.0 开始,标准库包括 String.trim

    【讨论】:

      【解决方案2】:

      将自己局限于标准库确实是一个错误,因为标准库缺少很多东西。例如,如果您要使用 Core,您可以这样做:

      open Core.Std
      
      let x = String.strip "  foobar   "
      let () = assert (x = "foobar")
      

      如果您想查看实现,当然可以查看 Core 的源代码。 ExtLib中也有类似的功能。

      【讨论】:

      • 也许我说错了。规则说:“除了语言/解释器本身的一部分之外,您不能保证任何库或插件。”分布是 INRIA OCaml。 Core 是否属于该类别?
      • 核心不是标准库的一部分。它是扩展标准的第三方库(如 Extlib 和 Batteries)。你可以在这里下载:janestcapital.com/?q=node/13
      • String.strip 是一个函数,它将删除由“drop”参数定义的内容 - ocaml.janestreet.com/ocaml-core/v0.9/doc/base/Base/String/… 默认情况下,“drop”是空格/制表符/等。所以它会和 String.trim 一样。
      【解决方案3】:

      怎么样

      let trim str =
        if str = "" then "" else
        let search_pos init p next =
          let rec search i =
            if p i then raise(Failure "empty") else
            match str.[i] with
            | ' ' | '\n' | '\r' | '\t' -> search (next i)
            | _ -> i
          in
          search init
        in
        let len = String.length str in
        try
          let left = search_pos 0 (fun i -> i >= len) (succ)
          and right = search_pos (len - 1) (fun i -> i < 0) (pred)
          in
          String.sub str left (right - left + 1)
        with
        | Failure "empty" -> ""
      

      (通过Code Codex

      【讨论】:

      • 这个问题在google的首页。因此,为了快速查找,我在这里给出了答案。它是 String.strip
      【解决方案4】:

      我相信在给出其他答案时,4.00 版还没有发布。实际上,在 OCaml 4.00 中,string module 中有一个 String.trim 函数来修剪前导和尾随空格。

      或者,如果你受限于旧版本的 OCaml,你可以使用这个从 4.00 的字符串模块的source 无耻复制的函数。

      let trim s =
        let is_space = function
          | ' ' | '\012' | '\n' | '\r' | '\t' -> true
          | _ -> false in
        let len = String.length s in
        let i = ref 0 in
        while !i < len && is_space (String.get s !i) do
          incr i
        done;
        let j = ref (len - 1) in
        while !j >= !i && is_space (String.get s !j) do
          decr j
        done;
        if !i = 0 && !j = len - 1 then
          s
        else if !j >= !i then
          String.sub s !i (!j - !i + 1)
        else
          ""
      ;;
      

      【讨论】:

        【解决方案5】:

        像这样简单的东西应该可以正常工作:

         #require "str";;
        
         let strip_string s =
           Str.global_replace (Str.regexp "[\r\n\t ]") "" s
        

        【讨论】:

        • 如果您提供的答案需要额外的编译标志,那么请包括实际编译此代码所需的所有内容。
        • 感谢您指出这一点。我添加了对 Str 模块的要求。
        【解决方案6】:

        标准库的

        String.trim
        

        确实如此。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-05
          • 2017-09-20
          • 1970-01-01
          • 2021-09-04
          相关资源
          最近更新 更多