2012-03-19 4 views
27

나는 다음과 같습니다스칼라의 경우 일치하는 부분 문자열

var serv = "chat" 

serv match { 

    case "chat" => Chat_Server ! Relay_Message(serv) 
    case _ => null 

} 

문제는 때때로 나는 또한 그래서, SERV 문자열의 끝에 추가 PARAM을 전달한다는 것입니다 :

var serv = "chat.message" 

인가 문자열의 일부와 일치하는 방식으로 Chat_Server로 전송됩니다.

덕분에 어떤 도움을 많이 감사합니다 :)

+0

아래와 같이 해결책이 있습니다. 하지만 아마도'serv'는 단순한'String'이 아닌 더 구조화 된 가치가되기를 원합니 까? –

+2

'case class'는 이것에 완벽 할 것입니다! – Kyle

+4

Scala에서는'null '의 사용을 피해야합니다. 대신에'Option'을 사용하십시오. 'null'은 Java와의 상호 운용성을 위해서만 존재합니다. – Jesper

답변

41

사용 정규 표현식에를 "채팅";)

val Pattern = "(chat.*)".r 

serv match { 
    case Pattern(chat) => "It's a chat" 
    case _ => "Something else" 
} 

그리고 정규 표현식에 당신도 쉽게 분할 할 수 있습니다 매개 변수 및 기본 문자열

:

val Pattern = "(chat)(.*)".r 

serv match { 
    case Pattern(chat,param) => "It's a %s with a %s".format(chat,param) 
    case _ => "Something else" 
} 
+2

인 경우 * guard *라고 불리는 경우 pattenr와 일치하는 "chat"변수가 분명히 쓸모가 없으므로 'Pattern (_)'으로 바꿀 수 있습니다 – Nicolas

+1

@ Nicolas 예, 권리. 나는 그것이 op 버전의'chat'가 서버에 대한 메시지로 사용될 것이기 때문에 그다지 비웃지 않았다. –

+0

솔루션에서'chat' 변수는 패턴이 일치하면 항상''chat ''과 같습니다. (그래서 내가 쓸모 없다고 썼다.) – Nicolas

43

변수에 바인드 일치하는 패턴을 가지고 변수로 시작 보장하기 위해 가드를 사용

// msg is bound with the variable serv 
serv match { 
    case msg if msg.startsWith("chat") => Chat_Server ! Relay_Message(msg) 
    case _ => null 
} 
+2

첫 번째 경우 표현식이 –