2013-01-22 35 views
21

Các mã sau đây:Làm cách nào để chia câu thành các từ được phân tách bằng nhiều khoảng trắng?

val sentence = "1 2 3 4".split(" ") 

mang lại cho tôi:

Array(1, 2, "", 3, "", "", 4) 

nhưng tôi thà muốn chỉ có dòng chữ:

Array(1, 2, 3, 4) 

Làm thế nào tôi có thể chia nhỏ câu khi các từ được phân tách bằng nhiều khoảng trắng?

+0

http://stackoverflow.com/questions/225337/how-do-i-split-a-string-with-any -whitespace-chars-as-delimiters hoạt động này. – yalkris

Trả lời

48

Sử dụng một biểu thức chính quy:

scala> "1 2 3".split(" +") 
res1: Array[String] = Array(1, 2, 3) 

Các "+" có nghĩa là "một hoặc nhiều trước" (trước đó là một không gian).

Hơn thế nữa, nếu bạn muốn chia trên tất cả các khoảng trắng:

scala> "1 2 3".split("\\s+") 
res2: Array[String] = Array(1, 2, 3) 

(.. Đâu "\\s" là một Pattern đó phù hợp với bất kỳ khoảng trắng Nhìn here để biết thêm ví dụ)

+0

cf. "1 2 3" .split ("" "\ s +" "") giống như "1 2 3" .split ("\\ s +") trong Scala. Chuỗi thô (chuỗi được bọc trong "" ") hữu ích trong mẫu phức tạp – Naetmul

+2

NB. Đối với các chuỗi bắt đầu bằng khoảng trống:" 1 2 3 ".split (" \\ s + "), điều này cho kết quả với phần tử đầu tiên của ai là một Có một regex sẽ tránh điều này không? – user48956

+0

@ user48956 "1 2 3" .trim.split ("\\ s +") –

4

Bạn có thể lọc ra "" từ phần tách Array.

scala> val sentence = "1 2 3 4".split(" ").filterNot(_ == "") 
sentence: Array[java.lang.String] = Array(1, 2, 3, 4) 
+0

Cái này cũng hoạt động nhưng tôi lại tìm thấy một câu trả lời nhỏ nhặt khác. Cảm ơn – yalkris

2

biểu thức chính quy này \\W+ cung cấp (alphaunmerical) từ, do đó

val sentence = "1 2 3 4".split("\\W+") 
sentence: Array[String] = Array(1, 2, 3, 4) 

Để dễ sử dụng, trong Scala 2.1 0. * và 2.11. * Xem xét

implicit class RichString(val s: String) extends AnyVal { 
    def words = s.split("\\W+") 
} 

Như vậy,

sentence.words 
res: Array[String] = Array(1, 2, 3, 4) 
Các vấn đề liên quan