web-dev-qa-db-fra.com

Comment faire correspondre une chaîne sur un préfixe et obtenir le reste?

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 _ =>
}
28
Freewind
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.

24
Brian Agnew

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")
}
13
Dave Griffith

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";
    }
  }
}
6
Krishna Kumar

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"
3
Xavier Guihot