2011-12-04 13 views
11

Czy ktoś może mi pomóc w kodowaniu efektywnego sprawdzania podłańcucha w OCaml? Biorąc pod uwagę dwa ciągi, sprawdź, czy pierwszy zawiera drugi?Sprawdzanie podłańcucha w Ocaml

Korzystając z modułu , możemy to zrobić?

Odpowiedz

9

Coś jak to może działać:

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

Oto niektóre testy funkcji:

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

to przyzwyczajenie praca, jeśli 's2' ma szczególny charakter regex sekwencje w nim, takie jak '.'. Najpierw musisz zadzwonić, "Str.quote s2". – nlucaroni

+1

Nie sądzę, że to prawda. Celem 'regexp_string' jest dopasowanie dokładnie określonego ciągu znaków. Prawdopodobnie cytuje wewnętrznie. Moje testy pokazują, że ten kod działa poprawnie. –

+1

zawiera jest złą nazwą, ponieważ ma już inne znaczenie w bibliotekach rozszerzeń. – ygrek

2
+1

Dostaję błąd. "String.exists" abc "" a ";; , Błąd: wartość niezwiązana String.exists ' Jak korzystać z tej nowej funkcji? – priyanka

+0

#potrzebuj "extlib" ;; otwórz ExtLib ;; – ygrek

+1

Nadal nie działa :( – priyanka

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

wymaga Core, prawda? – unhammer