如何从OCaml中的字符串中删除空格?

时间:2009-10-18 12:23:44

标签: string ocaml

要了解OCaml的基础知识,我正在解决其中一个使用它的简单facebook engineering puzzles。基本上,我想做类似以下Python代码的事情:

some_str = some_str.strip()

也就是说,我想从开头和结尾去除所有的空白。我没有在OCaml Str库中看到任何明显的事情。有没有简单的方法来做到这一点,或者我将不得不写一些代码来做它(我不介意,但不愿意:))。

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

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

将自己限制在标准库中真的是一个错误,因为标准的图书馆缺少很多东西。例如,如果您使用Core,则可以执行以下操作:

open Core.Std

let x = String.strip "  foobar   "
let () = assert (x = "foobar")

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

答案 2 :(得分:5)

怎么样

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

答案 3 :(得分:1)

我相信在给出其他答案的时候,版本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
    ""
;;

答案 4 :(得分:0)

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

 #require "str";;

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