Je peux écrire le code comme ceci:
str match {
case s if s.startsWith("!!!") => s.stripPrefix("!!!")
case _ =>
}
Mais je veux savoir s'il existe de meilleures solutions. Par exemple:
str match {
case "!!!" + rest => rest
case _ =>
}
val r = """^!!!(.*)""".r
val r(suffix) = "!!!rest of string"
Donc suffix
sera rempli avec reste de la chaîne, ou un scala.MatchError
se jette.
Une variante différente serait:
val r = """^(!!!){0,1}(.*)""".r
val r(prefix,suffix) = ...
Et prefix
correspondra soit au !!! ou être nul. par exemple.
(prefix, suffix) match {
case(null, s) => "No prefix"
case _ => "Prefix"
}
Ce qui précède est un peu plus complexe que ce dont vous pourriez avoir besoin, mais cela vaut la peine d'examiner la puissance de l'intégration d'expression rationnelle de Scala.
Si c'est le genre de chose que vous faites souvent, cela vaut probablement la peine de créer un extracteur
object BangBangBangString{
def unapply(str:String):Option[String]= {
str match {
case s if s.startsWith("!!!") => Some(s.stripPrefix("!!!"))
case _ => None
}
}
}
Ensuite, vous pouvez utiliser l'extracteur comme suit
str match{
case BangBangBangString(rest) => println(rest)
case _ => println("Doesn't start with !!!")
}
ou même
for(BangBangBangString(rest)<-myStringList){
println("rest")
}
Bonne question ! Même moi, j'essayais beaucoup pour trouver la réponse.
Voici un bon lien où j'ai trouvé la réponse
object _04MatchExpression_PatternGuards {
def main(args: Array[String]): Unit = {
val url: String = "Jan";
val monthType = url match {
case url if url.endsWith(".org") => "Educational Websites";
case url if url.endsWith(".com") => "Commercial Websites";
case url if url.endsWith(".co.in") => "Indian Websites"
case _ => "Unknow Input";
}
}
}
Démarrage Scala 2.13
, il est désormais possible de faire correspondre un motif à un String
par désapplication d'un interpolateur de chaîne :
"!!!hello" match {
case s"!!!$rest" => rest
case _ => "oups"
}
// "hello"