如何匹配前缀上的字符串并完成剩下的工作?

问题描述 投票:26回答:4

我可以写这样的代码:

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

但我想知道有没有更好的解决方案。例如:

str match {
    case "!!!" + rest => rest
    case _ =>
}
scala match
4个回答
24
投票
val r = """^!!!(.*)""".r
val r(suffix) = "!!!rest of string"

所以suffix将填充其余的字符串,或者scala.MatchError被抛出。

另一种变体是:

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

prefix将匹配!!!或者为空。例如

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

上面的内容比您可能需要的要复杂得多,但值得一看的是Scala正则表达式集成的强大功能。


12
投票

如果这是你经常做的事情,那么创建一个提取器可能是值得的

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")
}

6
投票

好问题 !即使我正在努力寻找答案。

这是一个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";
    }
  }
}

2
投票

启动Scala 2.13,现在可以通过String模拟匹配unapplying a string interpolator

"!!!hello" match {
  case s"!!!$rest" => rest
  case _           => "oups"
}
// "hello"
© www.soinside.com 2019 - 2024. All rights reserved.