我可以写这样的代码:
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)
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)
小智 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)
| 归档时间: |
|
| 查看次数: |
28692 次 |
| 最近记录: |