我可以写这样的代码:
str match {
case s if s.startsWith("!!!") => s.stripPrefix("!!!")
case _ =>
}
但我想知道有没有更好的解决方案。例如:
str match {
case "!!!" + rest => rest
case _ =>
}
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正则表达式集成的强大功能。
如果这是你经常做的事情,那么创建一个提取器可能是值得的
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")
}
好问题 !即使我正在努力寻找答案。
这是一个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";
}
}
}
启动Scala 2.13
,现在可以通过String
模拟匹配unapplying a string interpolator:
"!!!hello" match {
case s"!!!$rest" => rest
case _ => "oups"
}
// "hello"