2013-04-02 37 views
5

右から区切り文字で文字列を分割する方法は?右から区切り文字で文字列を分割する方法は?

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

Pythonは私がScalaでの後だものです.rsplit()方法があります。

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

そして、誰かが-1を返すlastIndexOfに述べているので、それは溶液で完全に罰金です:

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

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

'lastIndexOf'が-1''返すことができます唯一のトークンが存在する場合

このソリューションは破る文句を言いません。 – huynhjl

+1

'splitAt'は最初、空の文字列が返された場合@huynhjl、及び第二の元の文字列。 –

+0

ダング、あなたはすべてを考えました!あなたは正しいです。 reaccepted – 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?) 
関連する問題