2013-04-02 64 views
5

Làm cách nào để tách chuỗi bằng dấu phân cách từ bên phải?Làm thế nào để tách một chuỗi bằng dấu phân cách từ bên phải?

ví dụ:

scala> "hello there how are you?".rightSplit(" ", 1) 
res0: Array[java.lang.String] = Array(hello there how are, you?) 

Python có một phương pháp .rsplit() đó là những gì tôi là sau khi ở Scala:

In [1]: "hello there how are you?".rsplit(" ", 1) 
Out[1]: ['hello there how are', 'you?'] 

Trả lời

12

Tôi nghĩ rằng giải pháp đơn giản nhất là để tìm kiếm vị trí chỉ mục và sau đó phân chia dựa trên đó. Ví dụ:

scala> val msg = "hello there how are you?" 
msg: String = hello there how are you? 

scala> msg splitAt (msg lastIndexOf ' ') 
res1: (String, String) = (hello there how are," you?") 

Và kể từ khi một người nào đó nhận xét về lastIndexOf trở về -1, đó là hoàn toàn tốt đẹp với các giải pháp:

scala> val msg = "AstringWithoutSpaces" 
msg: String = AstringWithoutSpaces 

scala> msg splitAt (msg lastIndexOf ' ') 
res0: (String, String) = ("",AstringWithoutSpaces) 
+4

'lastIndexOf' có thể trở lại '-1'. – huynhjl

+1

@huynhjl Trong trường hợp này 'splitAt' sẽ trả về một chuỗi trống đầu tiên, và chuỗi gốc thứ hai. –

+0

Dang, bạn đã nghĩ về mọi thứ! Bạn đúng, nó hoạt động. – huynhjl

4

Bạn có thể sử dụng đơn giản biểu thức thông thường cũ:

scala> val LastSpace = " (?=[^ ]+$)" 
LastSpace: String = " (?=[^ ]+$)" 

scala> "hello there how are you?".split(LastSpace) 
res0: Array[String] = Array(hello there how are, you?) 

(?=[^ ]+$) nói rằng chúng ta sẽ nhìn về phía trước (?=) cho một nhóm các ký tự không gian ([^ ]) có độ dài ít nhất 1 ký tự. Cuối cùng không gian này theo sau bởi trình tự như vậy phải ở cuối chuỗi: $.

Giải pháp này sẽ không phá vỡ nếu chỉ có một mã thông báo:

scala> "hello".split(LastSpace) 
res1: Array[String] = Array(hello) 
+1

Tôi nghĩ về gợi ý một biểu thức chính quy, nhưng đó là cách ít hiệu quả và khó hiểu hơn cách tiếp cận đơn giản tôi đã kết thúc đề xuất. Không được sử dụng các giải pháp của bạn - điều này hoàn toàn khả thi và khác biệt so với các giải pháp khác - nhưng tôi tự hỏi nó là gì về các giải pháp phức tạp khiến mọi người thích chúng hơn? –

1
scala> val sl = "hello there how are you?".split(" ").reverse.toList 
sl: List[String] = List(you?, are, how, there, hello) 

scala> val sr = (sl.head :: (sl.tail.reverse.mkString(" ") :: Nil)).reverse 
sr: List[String] = List(hello there how are, you?) 
Các vấn đề liên quan