2009-10-18 115 views
6

要学习OCaml的基础知识,我正在使用它解决其中一个简单的facebook engineering puzzles。从本质上讲,我想这样做下面的Python代码:如何从OCaml中的字符串中删除空格?

some_str = some_str.strip() 

也就是说,我想从一开始和结束时去除所有的空白。我没有在OCaml Str库中看到任何明显的迹象。有没有简单的方法来做到这一点,或者我将不得不编写一些代码来做到这一点(我不介意,但不希望:))。

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

回答

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

这个问题是在谷歌的首页。所以为了快速查找,我在这里给出了一个答案。这是String.strip – 2013-03-15 16:44:17

5

这实在是一个错误限制自己的标准库,因为标准ilbrary缺少了很多东西。如果,例如,你使用的核心,你可以简单地做:

open Core.Std 

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

当然,你可以看一下核心的来源,如果你想看到的落实。 ExtLib中有类似的功能。

+0

也许我错过了。规则说:“除了语言/解释器本身的一部分外,你无法保证任何库或插件。”分发是INRIA OCaml。 Core是否属于该类别? – 2009-10-18 14:01:58

+3

核心不是标准库的一部分。这是扩展标准的第三方库(如Extlib和Batteries)。你可以在这里下载它:http://janestcapital.com/?q=node/13 – 2009-10-19 15:14:31

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

UPDATE:

从4.00.0起,标准库包括String.trim

1

我相信在t他指出何时给出其他答案,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 
    "" 
;; 
0

一些简单的像这应该很好地工作:

#require "str";; 

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

如果你提供了一个需要额外编译标志的答案,那么请包括实际编译此代码所需的所有东西。 – 2016-08-03 12:09:06

+0

谢谢你指出。我添加了对Str模块的要求。 – Thomas 2016-08-04 02:03:21