web-dev-qa-db-ja.com

接頭辞の文字列を照合して残りを取得する方法は?

私はこのようなコードを書くことができます:

str match {
    case s if s.startsWith("!!!") => s.stripPrefix("!!!")
    case _ =>
}

しかし、もっと良い解決策があるかどうか知りたいです。例えば:

str match {
    case "!!!" + rest => rest
    case _ =>
}
28
Freewind
val r = """^!!!(.*)""".r
val r(suffix) = "!!!rest of string"

したがって、suffixには残りの文字列が入力されるか、scala.MatchErrorがスローされます。

別のバリアントは次のとおりです。

val r = """^(!!!){0,1}(.*)""".r
val r(prefix,suffix) = ...

そしてprefixは!!!またはnullです。例えば.

(prefix, suffix) match {
   case(null, s) => "No prefix"
   case _ => "Prefix"
}

上記はあなたが必要とするよりも少し複雑ですが、Scalaの正規表現統合の威力を検討する価値があります。

24
Brian Agnew

頻繁に行うようなことであれば、おそらくエクストラクターを作成する価値があります。

object BangBangBangString{ 
   def unapply(str:String):Option[String]= {
       str match {
          case s if s.startsWith("!!!") => Some(s.stripPrefix("!!!"))
          case _ => None
       }
   }
}

その後、次のように抽出を使用できます

str match{
   case BangBangBangString(rest) => println(rest)
   case _ => println("Doesn't start with !!!")
}

あるいは

for(BangBangBangString(rest)<-myStringList){
   println("rest")
}
13
Dave Griffith

良い質問 !私も答えを見つけるために多くのことを試みていました。

これは私が答えを見つけた 良いリンクです

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

開始中Scala 2.13、これでStringをパターンマッチングすることが可能になりました 文字列補間を適用解除

"!!!hello" match {
  case s"!!!$rest" => rest
  case _           => "oups"
}
// "hello"
3
Xavier Guihot