开发者

How do I strip whitespace from a string in OCaml?

To learn the basics of OCaml, I'm solving one开发者_如何学Go of the easy facebook engineering puzzles using it. Essentially, I'd like to do something like the following Python code:

some_str = some_str.strip()

That is, I'd like to strip all of the whitespace from the beginning and the end. I don't see anything obvious to do this in the OCaml Str library. Is there any easy way to do this, or am I going to have to write some code to do it (which I wouldn't mind, but would prefer not to :) ).

Bear in mind that I'm limited to what's in the libraries that come with the OCaml distribution.


I know this question is uber-old, but I was just pondering the same thing and came-up with this (from toplevel):

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

then

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

UPDATE:

As of 4.00.0, standard library includes String.trim


It is really a mistake to limit yourself to the standard library, since the standard ilbrary is missing a lot of things. If, for example, you were to use Core, you could simply do:

open Core.Std

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

You can of course look at the sources of Core if you want to see the implementation. There is a similar function in ExtLib.


how about

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" -> ""

(Via Code Codex)


I believe at the point when the other answers were given, version 4.00 was not out yet. Actually, in OCaml 4.00, there is a String.trim function in the string module to trim leading and trailing white spaces.

Alternatively, if you're restricted to an older version of OCaml, you may use this function that is shamelessly copied from the source of 4.00's string module.

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
    ""
;;


Something simple like this should work fine:

 #require "str";;

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


Standard library's

String.trim

does exactly that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜