web-dev-qa-db-fra.com

Scala - chaîne partielle de correspondance de casse

J'ai le suivant:

serv match {

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

}

Le problème est que, parfois, je passe également un paramètre supplémentaire à la fin de la chaîne de service, donc:

var serv = "chat.message"

Est-il possible de faire correspondre une partie de la chaîne afin qu'elle soit toujours envoyée à Chat_Server?

Merci pour toute aide, très appréciée :)

31
jhdevuk

Utilisez des expressions rationnelles;) 

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

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

Et avec les expressions rationnelles, vous pouvez même facilement scinder un paramètre et une chaîne de base: 

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

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

Faites en sorte que la correspondance de modèle soit liée à une variable et utilisez un guard pour vous assurer que la variable commence par "chat"

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

Si vous souhaitez supprimer des groupements lorsque vous utilisez des expressions rationnelles, veillez à utiliser un caractère générique de séquence tel que _* (selon la documentation de Scala ).

De l'exemple ci-dessus:

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

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