2009-10-18 111 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