Я могу написать код следующим образом:
str match {
case s if s.startsWith("!!!") => s.stripPrefix("!!!")
case _ =>
}
Но я хочу знать, есть ли лучшие решения. Например:
str match {
case "!!!" + rest => rest
case _ =>
}
Я могу написать код следующим образом:
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 regexp.
Если вы часто это делаете, возможно, стоит создать экстрактор
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")
}
Хороший вопрос! Даже я много пытался узнать ответ.
Вот хорошая ссылка, где я нашел ответ
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
с шаблоном, не применяя интерполятор строк:
"!!!hello" match {
case s"!!!$rest" => rest
case _ => "oups"
}
// "hello"