2013-05-27 44 views
5

Tôi đang cố gắng tách một chuỗi văn bản bằng bộ tách thanh |. 123.123.123.123|000.000.000.000 cho mỗi khối địa chỉ IP. Nhưng mỗi số được tách không theo |.Tách chuỗi bằng dấu phân cách được tách thành từng ký tự trong Scala

scala> "123.123.123.123|000.000.000.000".split("|") 
res30: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, |, 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0, ., 0, 0, 0) 

scala> "123.123.123.123".split("|") 
res33: Array[java.lang.String] = Array("", 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3, ., 1, 2, 3) 

Vì vậy, tôi đặt dấu phân cách là Char và nó hiển thị những gì tôi dự định.

scala> "123.123.123.123|000.000.000.000".split('|') 
res31: Array[String] = Array(123.123.123.123, 000.000.000.000) 

scala> "123.123.123.123".split('|') 
res32: Array[String] = Array(123.123.123.123) 

Tại sao nhân vật duy nhất tạo nên sự khác biệt lớn?

Tôi đã đọc tài liệu Scala và StringLike.scala và không có câu trả lời.

def split(separators: Array[Char]): Array[String] 
def split(separator: Char): Array[String] 

Cảm ơn.

+0

Theo [tài liệu] (http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.StringOps), 'split' lấy một Char làm đối số. – squiguy

+2

@squiguy không chỉ Char: nó có thể trở lại [phân chia của java, mà có String] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split (java. lang.String)) [regex] –

+0

@ om-nom-nom Chắc chắn, trong trường hợp đó '|' là đặc biệt mà rõ ràng là những gì bạn đã nói trong câu trả lời của bạn. – squiguy

Trả lời

11

Phương pháp tách chấp nhận string hoặc (các) ký tự. Nếu bạn sử dụng chuỗi nó sẽ được hiểu là regexp và "|" được coi là regex 'hoặc' - trong trường hợp của bạn, nó quay trở lại 'mọi ký tự đi vào thùng riêng của nó'. Thoát khỏi nó để có delimeter liệu:

"123.123.123.123|000.000.000.000".split("\\|") 
res1: Array[String] = Array(123.123.123.123, 000.000.000.000) 

nhân vật tách được hiểu như là, vì vậy bạn có kết quả mong muốn mà không phiền phức

+0

Cảm ơn @ om-nom-nom! Tôi quên nhớ nhiều phương pháp Scala thực sự là từ các lớp java.lang và java. Tôi sẽ cùng với javadoc vào lần tới. – eces

2

Lưu ý rằng, như om-nôm-nom đề cập một cách chính xác (nhưng không cung cấp ví dụ), nhân vật (được kèm theo trong đơn ') cũng có giá trị:

"123.123.123.123|000.000.000.000".split('|') 

tôi tìm thấy điều này là rõ ràng hơn/dễ đọc. Tôi cũng giả định rằng điều này sẽ nhanh hơn, vì nó không phải gọi trình phân tích cú pháp regex. Nhưng đó là suy đoán của khóa học, và cũng không cần thiết tối ưu hóa vi mô.

+0

Nó nên được nhanh hơn đáng kể so với regexing - không có nghi ngờ về điều đó. Trên thực tế regexing, trong kịch bản đó sẽ chỉ đơn giản là một sai lầm. Nhưng câu hỏi không phải là về điều đó, và những gì bạn đề nghị thực sự đã được phát hiện trong câu hỏi. –

+0

Vâng, tôi nói rằng om-nom-nom đã đề cập đến nó. Tôi chỉ muốn cung cấp một ví dụ thực tế, vì tôi biết nhiều người (bao gồm cả bản thân mình) sẽ thường chỉ đọc một câu trả lời cho một đoạn mã, thường là giải pháp. Kể từ khi tôi xem xét các ví dụ mã om-nom-nom đăng không tối ưu, tôi đăng của riêng tôi :) – fresskoma

+1

@ x3ro tốt, tôi đã không viết này bởi vì op đã làm nó trong ví dụ của mình (res31) ;-) Nhưng tôi đồng ý rằng điều này có thể nhanh hơn phiên bản chuỗi –

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