如何在一行中实现“substringAfter”?

时间:2012-02-27 03:40:11

标签: string scala

我想在scala中找到一个单行函数来实现substringAfter,这与commons-lang的StringUtils.substringAfter()相同。

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)
  }
}

如何获得一行?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分: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

答案 2 :(得分:1)

我的朋友给了我一个解决方案:

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

答案 3 :(得分:1)

您的版本已重写为使用默认功能的地图:

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