开发者

How to match a string on a prefix and get the rest?

开发者 https://www.devze.com 2023-03-20 17:37 出处:网络
I can write the code like this: str match { case s if s.startsWith(\"!!!\") => s.stripPrefix(\"!!!\")

I can write the code like this:

str match {
    case s if s.startsWith("!!!") => s.stripPrefix("!!!")
    case _ =>
开发者_开发技巧}

But I want to know is there any better solutions. For example:

str match {
    case "!!!" + rest => rest
    case _ =>
}


val r = """^!!!(.*)""".r
val r(suffix) = "!!!rest of string"

So suffix will be populated with rest of string, or a scala.MatchError gets thrown.

A different variant would be:

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

And prefix will either match the !!! or be null. e.g.

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

The above is a little more complex than you might need, but it's worth looking at the power of Scala's regexp integration.


Starting Scala 2.13, it's now possible to pattern match a String by unapplying a string interpolator:

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


If it's the sort of thing you do often, it's probably worth creating an extractor

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

Then you can use the extractor as follows

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

or even

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


Good question ! Even i was trying a lot to find out the answer.

Here is a good link where I found the answer

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";
    }
  }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消