2012-02-27 18 views
0

我想找到一個單行函數來執行scala中的substringAfter,這與commons-lang的StringUtils.substringAfter()相同。如何在一行中實現「substringAfter」?

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

一些測試:

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

沒有必要在這裏考慮null海峽。

現在,我有這樣的解決方案:

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

如何獲得一個行嗎?

+1

至少對我來說這已經很簡單了。 – 2012-02-27 03:42:48

+1

你有你的函數定義。你看看字符串是否在使用1行。如果是這樣的話,如果它不是你在1行中返回你想要的東西,那麼你在1行中返回其他東西。 我與尼克拉斯B我沒有看到你想要多簡單嗎? – Jordan 2012-02-27 03:55:02

+0

@Jordan,也許我想要一個單行功能,我只是更新了這個問題。 – Freewind 2012-02-27 03:56:44

回答

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

可以在兩個case-statement之間留下分號。 – sschaef 2012-02-27 08:44:45

4

效率較低,但略短:

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

,或者如果正則表達式是你的事:

def substringAfter(s: String, k: String) = 
    (".*?(?:\Q"+k+"\E)(.*)").r.unapplySeq(s).flatten.mkString 
+0

非常有幫助,我從這些2中學到了很多。 – Freewind 2012-02-27 04:46:03

+0

+1的正則表達式。 – 2012-02-27 13:31:57

+1

我認爲該字符串需要正則表達式轉義... – 2012-02-27 14:22:56

1

我的朋友給我一個解決方案:

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

什麼是'stripStart'?你的意思是'stripPrefix',對吧? – 2012-02-27 04:44:52

+1

第二個不起作用,例如'substringAfter(「1234567」,「29」)' – 2012-02-27 05:06:18

+0

@ LuigiPlinge,謝謝,我將刪除它 – Freewind 2012-02-27 07:00:52

1

你版本改寫爲使用帶de的Map故障功能:

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