2012-02-27 4 views
0

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 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 라인에 다른 것을 돌려 주면됩니다. 나는 Niklas B와 함께있다. 얼마나 단순 해지고 싶지 않은가? – Jordan

+0

@ Jordan, 한 줄짜리 기능을 원한다면 방금 질문을 업데이트했습니다. – Freewind

답변

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

두 개의 case-statement 사이에 세미콜론을 두는 것이 가능합니다. – sschaef

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

+0

+1 정규식. –

+1

문자열이 정규식을 이스케이프 처리해야한다고 생각합니다. –

1

내 친구가 나에게 솔루션을 주었다

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

'stripStart'는 무엇입니까? 'stripPrefix'라는 뜻인가요? –

+1

두 번째가 작동하지 않습니다. 'substringAfter ("1234567", "29")' –

+0

@ LuigiPlinge, 고마워, 내가 그것을 제거 할 것이다 – Freewind

1

당신의 de와지도를 사용하도록 재 작성된 버전 결함 기능 :

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