2009-10-18 11 views
6

Aby poznać podstawy OCaml, rozwiązuję jeden z łatwych w użyciu facebook engineering puzzles. Zasadniczo chciałbym zrobić coś następującego kodu Pythona:Jak usunąć białe znaki z ciągu znaków w OCaml?

some_str = some_str.strip() 

Oznacza to, że chciałabym się rozebrać wszystkie białe znaki z początku i końca. Nie widzę niczego oczywistego, aby to zrobić w bibliotece OCaml Str. Czy jest jakiś łatwy sposób na zrobienie tego, czy też będę musiał napisać jakiś kod, żeby to zrobić (co nie miałbym nic przeciwko, ale wolałbym nie :)).

Pamiętaj, że jestem ograniczony do tego, co znajduje się w bibliotekach dołączonych do dystrybucji OCaml.

Odpowiedz

5

jak o

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)

+3

To pytanie jest na górnej stronie google. Tak więc, dla szybkiego wyszukiwania, umieszczam tutaj odpowiedź. To jest String.strip –

5

To jest naprawdę błędem ograniczać się do standardowej biblioteki, ponieważ średnia ilbrary brakuje wielu rzeczy. Jeśli, na przykład, były w użyciu Core można po prostu zrobić:

open Core.Std 

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

Można oczywiście szukać u źródeł rdzenia, jeśli chcesz zobaczyć realizację. W ExtLib istnieje podobna funkcja.

+0

Może błędnie napisałem. Reguły mówią: "Nie masz gwarancji żadnych bibliotek ani wtyczek poza tym, co jest częścią samego języka/tłumacza." Dystrybucja to INRIA OCaml. Czy Core należy do tej kategorii? –

+3

Rdzeń nie należy do standardowej biblioteki. Jest to trzecia biblioteka, która rozszerza standard (jak Extlib i baterie). Możesz go pobrać tutaj: http://janestcapital.com/?q=node/13 –

8

Wiem, że to pytanie jest uber-stary, ale ja po prostu rozważając to samo i przyszedł się z tym (z Toplevel):

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

następnie

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

UPDATE:

Począwszy od wersji 4.00.0, biblioteka standardowa zawiera String.trim

1

Wierzę w t wskazuje, kiedy podano inne odpowiedzi, wersja 4.00 jeszcze się nie pojawiła. W rzeczywistości w OCaml 4.00 istnieje funkcja String.trim w string module do przycinania wiodących i końcowych białych znaków.

Alternatywnie, jeśli jesteś ograniczony do starszej wersji OCaml, możesz użyć tej funkcji, która jest bezwstydnie skopiowana z source modułu string 4.00.

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

Coś prostego jak to powinno działać prawidłowo:

#require "str";; 

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

jeśli podasz odpowiedź wymagającą dodatkowych flag kompilacji, dołącz wszystkie rzeczy potrzebne do rzeczywistego skompilowania tego kodu. –

+0

Dzięki za wskazanie tego. Dodałem wymaganie dla modułu Str. – Thomas

Powiązane problemy