2012-04-12 35 views
49

Tôi có hai chuỗi trong scala và tôi muốn tìm hiểu, nếu chuỗi lớn hơn (needle) có chứa một chuỗi nhỏ hơn (haystack).Cách tìm kiếm scala thành ngữ là gì, nếu một chuỗi đã cho chứa chuỗi con đã cho?

Những gì tôi thấy được làm việc đó với regexps và phù hợp như thế này (from this question):

needle.r.pattern.matcher(haystack).matches

đó là (1) hiển nhiên overcomplicated cho một vấn đề đơn giản như vậy, nhưng quan trọng hơn, (2) doesn 't làm việc đối với tôi, vì

"needle".r.pattern.matcher("Finding needle in haystack").matches

lợi nhuận

Boolean = false

+7

Tôi có thể thiếu cái gì, nhưng chuyện gì vậy có chứa? – JaimeJorge

+0

Tôi sắp hỏi cùng một điều – covertCoder

+3

Không có gì sai với nó, tôi chỉ không tìm thấy nó :) đó là tất cả. –

Trả lời

88

Nếu bạn muốn làm điều đó với hiệu quả tối đa, bạn có thể phải tự viết (hoặc tìm một thuật toán tìm kiếm chuỗi con tốt ở đâu đó). Nếu bạn chỉ muốn nó hoạt động ở tất cả, sau đó trong Scala:

scala> "Finding needle in haystack" contains "needle" 
res0: Boolean = true 

scala> "Finding needle in haystack" indexOf "needle" 
res1: Int = 8 

Đây là những không tìm kiếm regex. Bạn không sử dụng chính xác so khớp regex (chỉnh sửa: vì mã đó yêu cầu kết hợp chính xác với toàn bộ chuỗi, không phải để tìm chuỗi con phù hợp), nhưng đó là một vấn đề khác. Nếu bạn muốn có một đếm số của trận đấu, bạn có thể làm điều gì đó như

scala> "needle".r.findAllIn("Finding needle in haystack").length 
res2: Int = 1 
+7

Nếu bất kỳ ai thắc mắc, 'contains' và' indexOf' chỉ là các phương thức trên 'java.lang.String' và không có ma thuật Scala xảy ra ở đây. Tôi đã không nhìn vào nguồn nhưng tôi hy vọng chúng được tối ưu hóa tốt phương pháp. –

+0

Và những gì quá chậm hoặc không được tối ưu hóa về chúng? – matanster

13

Mặc dù đã trả lời tôi nghĩ rằng tôi cũng sẽ cung cấp regex này phong cách

scala> "I have a needle in my haystack" matches ".*needle.*" 
res10: Boolean = true 
+1

Điều này diễn ra chậm và chỉ hoạt động nếu không có thiết bị đầu cuối dòng. –

+0

chậm so với những gì? –

+1

So với câu trả lời khác. indexOf() (có chứa() sử dụng) được tối ưu hóa tốt cả ở cấp Java và trong JVM. –

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