Как реализовать "substringAfter" в одну строку? - PullRequest
0 голосов
/ 27 февраля 2012

Я хочу найти однострочную функцию для реализации substringAfter в scala, которая совпадает с StringUtils.substringAfter().

commons-lang.
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 ]

5 голосов
/ 27 февраля 2012
def substringAfter(s:String,k:String) = { s.indexOf(k) match { case -1 => ""; case i => s.substring(i+k.length)  } }
4 голосов
/ 27 февраля 2012

Менее эффективен, но немного короче:

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
1 голос
/ 27 февраля 2012

Ваша версия переписана для использования карты с функцией по умолчанию:

def substringAfter(s: String, k: String) = 
  Map(-1 -> "").withDefault(i => s.substring(i + k.length))(s.indexOf(k))
1 голос
/ 27 февраля 2012

Мой друг дал мне решение:

def substringAfter(str:String, key:String) =
   str.stripPrefix(str.take(str.indexOf(key))+key)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...