2013-04-02 5 views
5

Как разбить строку на разделитель справа?Как разбить строку на разделитель справа?

например.

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

Python имеет метод .rsplit() который, что я после в Scala:

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

ответ

12

Я думаю, что самое простое решение для поиска позиции индекса, а затем разделить на основе этого. Например:

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

А так как кто-то заметил на lastIndexOf возвращение -1, что совершенно нормально с решением:

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

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

'lastIndexOf' может вернуться' -1'. – huynhjl

+1

@huynhjl В этом случае 'splitAt' сначала возвращает пустую строку, а вторую - вторую. –

+0

Dang, вы все подумали! Вы правы, это работает. – huynhjl

4

Вы можете использовать простые старые регулярные выражения:

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

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

(?=[^ ]+$) говорит, что мы будем смотреть вперед (?=) на группу без пробелов ([^ ]) с длиной не менее 1 символа. Наконец, это пространство, за которым следует такая последовательность, должно быть в конце строки: $.

Это решение не сломают, если есть только один маркер:

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

Я думал о том, чтобы предлагать регулярное выражение, но это менее эффективно и труднее понять, чем более простой подход, который я предложил. Не бросать аферы на ваше решение, которое отлично работает и отличается от других представленных, но мне интересно, что это такое сложные решения, которые заставляют людей их отдать предпочтение? –

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?) 
Смежные вопросы