2012-02-27 1 views
0

substringAfterをscalaに実装するための1行の関数を見つけたいと思います。これはcommons-langのStringUtils.substringAfter()と同じです。"substringAfter"を1行で実装する方法は?

def substringAfter(str:String, key:String) = ... 

一部のテスト:

substringAfter("1234512345", "23") // ==> 4512345 
substringAfter("1234512345", "a") // ==> "" 
substringAfter("1234512345", "") // ==> 1234512345 
substringAfter("", "23") // ==> "" 

ここnull STRを検討する必要はありません。

def substringAfter(s:String,k:String) = { 
    s.indexOf(k) match { 
    case -1 => "" 
    case i => s.substring(i+k.length) 
    } 
} 

がどのように1行の1を得るために:今のところ

、私はそのような解決策がありますか?

+1

少なくとも私はすでにそれはかなりシンプルです。 –

+1

関数定義があります。文字列が1行であるかどうかを確認します。 1行に何かを返すのであれば、1行に何か他のものを返します。 私はNiklas Bと付き合っています。私はあなたがどれくらい簡単になりたいかわかりません。 – Jordan

+0

@ Jordan、多分私は1行の関数が必要ですが、私はちょうど質問を更新しました。 – Freewind

答えて

5
def substringAfter(s:String,k:String) = { s.indexOf(k) match { case -1 => ""; case i => s.substring(i+k.length) } } 
+0

2つのcase文の間にセミコロンを置くことは可能です。 – sschaef

4

あまり効率的ではなく、わずかに短い:

def substringAfter(s: String, k: String) = 
    s.tails.find(_.startsWith(k)).map(_.drop(k.length)).getOrElse("") 

または正規表現はあなたのものである場合:

def substringAfter(str:String, key:String) = 
    str.stripPrefix(str.take(str.indexOf(key))+key) 
+0

非常に参考になった、私はこれらの2から多くを学んだ。 – Freewind

+0

+1正規表現です。 –

+1

文字列が正規表現をエスケープする必要があると思います... –

1

私の友人は私に解決策を与えましたdeとマップを使用するように書き直されたバージョンフォールト機能:

def substringAfter(s: String, k: String) = 
    Map(-1 -> "").withDefault(i => s.substring(i + k.length))(s.indexOf(k)) 
+1

'stripStart'とは何ですか?あなたは 'stripPrefix'を意味します、そうですか? –

+1

2番目の方法は機能しません。 'substringAfter(" 1234567 "、" 29 ")' –

+0

@ LuigiPlinge、ありがとう、私はそれを削除します – Freewind

1

あなた:

def substringAfter(s: String, k: String) = 
    (".*?(?:\Q"+k+"\E)(.*)").r.unapplySeq(s).flatten.mkString 
関連する問題