2011-12-04 31 views
11

Ai đó có thể giúp tôi trong việc mã hóa kiểm tra chuỗi con hiệu quả trong OCaml không? Cho hai chuỗi, kiểm tra xem chuỗi đầu tiên có chứa chuỗi thứ hai không?Kiểm tra chuỗi con tại Ocaml

Sử dụng mô-đun Str, chúng tôi có thể thực hiện việc này không?

Trả lời

9

Something như thế này có thể làm việc:

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

Dưới đây là một số xét nghiệm của hàm:

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

wont work này nếu 's2' có nhân vật regex đặc biệt các chuỗi trong đó, như '.'. Bạn sẽ phải gọi 'Str.quote s2' trước. – nlucaroni

+1

Tôi không nghĩ đó là sự thật. Mục đích của 'regexp_string' là khớp chính xác với một chuỗi cụ thể. Nó có lẽ là trích dẫn nội bộ. Kiểm tra của tôi cho thấy mã này hoạt động OK. –

+1

chứa là một tên xấu, gây ra nó đã có ý nghĩa khác trong thư viện mở rộng. – ygrek

2
+1

Tôi gặp lỗi. 'String.exists "abc" "a" ;; , Lỗi: Giá trị chưa gửi String.exists ' Vậy làm cách nào để sử dụng chức năng mới này? – priyanka

+0

#require "extlib" ;; mở ExtLib ;; – ygrek

+1

Nó vẫn không hoạt động: ( – priyanka

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

yêu cầu Core, phải không? – unhammer

Các vấn đề liên quan