2011-12-04 13 views
11

¿Alguien me puede ayudar a codificar un cheque de subcadena eficaz en OCaml? Dadas dos cadenas, verifique si la primera contiene la segunda.Comprobación de subcadenas en Ocaml

Usando el módulo Str, ¿podemos hacer esto?

Respuesta

9

Algo como esto podría funcionar:

let contains s1 s2 = 
    let re = Str.regexp_string s2 
    in 
     try ignore (Str.search_forward re s1 0); true 
     with Not_found -> false 

Estas son algunas pruebas de la función:

# contains "abcde" "bc";; 
- : bool = true 
# contains "abcde" "bd";; 
- : bool = false 
# contains "abcde" "b.";; 
- : bool = false 
# contains "ab.de" "b.";; 
- : bool = true 
+0

esto no trabajará si 's2' tiene carácter especial de expresiones regulares secuencias en él, como '.'. Tendrás que llamar, 'Str.quote s2' primero. – nlucaroni

+1

No creo que sea cierto. El propósito de 'regexp_string' es hacer coincidir exactamente una cadena en particular. Presumiblemente hace citas internas. Mis pruebas muestran que este código funciona bien. –

+1

contiene un nombre incorrecto, porque ya tiene otro significado en las bibliotecas de extensión. – ygrek

2
+1

Recibo un error. 'String.exists' abc '' a ';; , Error: valor sin enlazar String.exists ' Entonces, ¿cómo puede utilizar esta nueva función? – priyanka

+0

#require "extlib" ;; abrir ExtLib ;; – ygrek

+1

Todavía no funciona :( – priyanka

0
let contains_substring search target = 
    String.substr_index search target <> None 
+0

requiere Core, ¿no? – unhammer