2013-04-02 9 views
5

Jak podzielić łańcuch za pomocą ogranicznika od prawej?Jak podzielić ciąg znaków przez ogranicznik od prawej?

np.

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

Pythona ma metodę .rsplit() który jest co jestem po w Scala:

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

Odpowiedz

12

Myślę, że najprostszym rozwiązaniem jest, aby szukać pozycji indeksu, a następnie dzielone na podstawie tego. Na przykład:

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?") 

A skoro ktoś zauważył na lastIndexOf powrocie -1, to perfekcyjnie z rozwiązaniem:

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

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

'lastIndexOf' może powrócić' -1'. – huynhjl

+1

@huynhjl W takim przypadku 'splitAt' zwróci pusty ciąg pierwszy, a oryginalny ciąg drugi. –

+0

Dang, pomyślałeś o wszystkim! Masz rację, działa. – huynhjl

4

Można używać zwykłego wyrażeń stare regularnych:

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

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

(?=[^ ]+$) mówi, że będziemy patrzeć w przyszłość (?=) dla grupy znaków spoza przestrzeni ([^ ]) o długości co najmniej 1 znaku. W końcu ta przestrzeń, po której następuje taka sekwencja, musi znajdować się na końcu ciągu: $.

Rozwiązanie to przyzwyczajenie się złamać, jeżeli jest tylko jeden znak:

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

Myślałem o sugerowaniu wyrażenia regularnego, ale jest to o wiele mniej wydajne i trudniejsze do zrozumienia niż prostsze podejście, które zasugerowałem. Aby nie rzucać okiem na twoje rozwiązanie - które jest doskonale wykonalne i inne niż prezentowane przez innych - ale zastanawiam się, co to jest w przypadku złożonych rozwiązań, które sprawiają, że ludzie je preferują? –

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?) 
Powiązane problemy