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

Fre*_*ind 28 scala match

我可以写这样的代码:

str match {
    case s if s.startsWith("!!!") => s.stripPrefix("!!!")
    case _ =>
}
Run Code Online (Sandbox Code Playgroud)

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

str match {
    case "!!!" + rest => rest
    case _ =>
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*new 24

val r = """^!!!(.*)""".r
val r(suffix) = "!!!rest of string"
Run Code Online (Sandbox Code Playgroud)

因此suffix将填充其余的字符串,或者scala.MatchError被抛出.

另一种变体是:

val r = """^(!!!){0,1}(.*)""".r
val r(prefix,suffix) = ...
Run Code Online (Sandbox Code Playgroud)

并且prefix要么匹配!!! 或者为空.例如

(prefix, suffix) match {
   case(null, s) => "No prefix"
   case _ => "Prefix"
}
Run Code Online (Sandbox Code Playgroud)

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


Xav*_*hot 16

开始Scala 2.13,现在可以String通过不应用字符串插值器来模式匹配 a :

"!!!hello" match {
  case s"!!!$rest" => rest
  case _           => "oups"
}
// "hello"
Run Code Online (Sandbox Code Playgroud)

  • 多么神奇的功能啊! (2认同)

Dav*_*ith 13

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

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

然后您可以使用提取器,如下所示

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

甚至

for(BangBangBangString(rest)<-myStringList){
   println("rest")
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用startsWith参数的第一个参数创建类似Prefix提取器的类,而不是使用单个用户提取器,然后使用它:`val BandBangBangString = new PrefixExtractor("!!!")` (2认同)

小智 6

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

这是一个很好的链接,我找到了答案

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";
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这回答了一个不同的问题. (2认同)