2013-04-02 15 views
5

Come dividere una stringa con un delimitatore da destra?Come dividere una stringa per delimitatore da destra?

ad es.

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

Python ha un metodo .rsplit() che è quello che sto cercando in Scala:

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

risposta

12

Penso che la soluzione più semplice è quella di cercare la posizione di indice e poi diviso sulla base di tale. Per esempio:

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

E dal momento che qualcuno rimarcato lastIndexOf ritorno -1, che è perfettamente bene con la soluzione:

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

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

'lastIndexOf' può tornare' -1'. – huynhjl

+1

@huynhjl In questo caso 'splitAt' restituirà prima una stringa vuota e la stringa originale secondo. –

+0

Dang, hai pensato a tutto! Hai ragione funziona. – huynhjl

4

Si potrebbe utilizzare semplici vecchie espressioni regolari:

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

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

(?=[^ ]+$) dice che guarderemo avanti (?=) per un gruppo di caratteri non spaziali ([^ ]) con almeno 1 carattere di lunghezza. Infine, questo spazio seguito da tale sequenza deve essere alla fine della stringa: $.

Questa soluzione sogliono rompere se v'è un solo token:

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

ho pensato di suggerire un'espressione regolare, ma è molto meno efficiente e più difficile da capire rispetto all'approccio più semplice che ho finito per suggerire. Per non lanciare aspersioni sulla soluzione - che è perfettamente lavorabile e diversa dalle altre presentate -, ma mi chiedo che cosa si tratta di soluzioni complesse che fanno sì che le persone li preferiscano. –

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?) 
Problemi correlati