2009-10-18 15 views
6

Para aprender los conceptos básicos de OCaml, estoy resolviendo uno de los facebook engineering puzzles fáciles de usar. En esencia, me gustaría hacer algo como el siguiente código Python:¿Cómo elimino el espacio en blanco de una cadena en OCaml?

some_str = some_str.strip() 

Es decir, me gustaría quitar todos los espacios en blanco del principio y el fin. No veo nada obvio para hacer esto en la biblioteca OCaml Str. ¿Hay alguna manera fácil de hacerlo, o voy a tener que escribir un código para hacerlo (que no me importaría, pero preferiría no :)).

Tenga en cuenta que estoy limitado a lo que hay en las bibliotecas que vienen con la distribución OCaml.

Respuesta

5

¿qué tal

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

Esta pregunta está en la primera página de Google. Entonces, para una búsqueda rápida, estoy respondiendo aquí. Es String.strip –

5

lo que realmente es un error limitarse a la biblioteca estándar, ya que el ilbrary norma no se encuentra una gran cantidad de cosas. Si, por ejemplo, se va a utilizar Core, usted podría simplemente hacer:

open Core.Std 

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

Por supuesto, puede mirar las fuentes de Core, si quieres ver la ejecución. Hay una función similar en ExtLib.

+0

Quizás me equivoque. Las reglas dicen: "No se garantiza ninguna biblioteca o complemento más allá de lo que es parte del lenguaje/intérprete". La distribución es INRIA OCaml. ¿El núcleo cae bajo esa categoría? –

+3

Core no es parte de la biblioteca estándar. Es una biblioteca de terceros que amplía el estándar (como Extlib y baterías). Puede descargarlo aquí: http://janestcapital.com/?q=node/13 –

8

Sé que esta pregunta es súper-viejo, pero yo estaba pensando en la misma cosa y vine arriba con este (de nivel superior):

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

continuación

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

ACTUALIZACIÓN:

A partir de 4.00.0, la biblioteca estándar incluye String.trim

1

Creo en t señaló cuando se dieron las otras respuestas, la versión 4.00 aún no había salido. En realidad, en OCaml 4.00, hay una función String.trim en el string module para recortar los espacios en blanco iniciales y finales.

Alternativamente, si está restringido a una versión anterior de OCaml, puede usar esta función que se copia desvergonzadamente desde el módulo de cadena source de 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

Algo tan simple como este debería funcionar bien:

#require "str";; 

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

si proporciona una respuesta que requiere indicadores de compilación adicionales, incluya todas las cosas necesarias para compilar este código. –

+0

Gracias por señalar eso. Agregué el requisito para el módulo Str. – Thomas

Cuestiones relacionadas