2011-07-17 12 views

Odpowiedz

20
val r = """^!!!(.*)""".r 
val r(suffix) = "!!!rest of string" 

Więc suffix zostanie wypełnione reszty łańcucha lub scala.MatchError zostaje wrzucony.

innego wariantu byłoby:

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

I prefix albo będzie dopasować !!! lub mieć wartość zerową. na przykład

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

Powyższe jest trochę bardziej skomplikowane niż może być konieczne, ale warto patrząc na moc integracji regexp Scala.

9

Jeśli jest coś takiego robisz często, to chyba warto tworzenia ściągacza

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

Następnie można użyć ściągacza następująco

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

lub nawet

for(BangBangBangString(rest)<-myStringList){ 
    println("rest") 
} 
+2

zamiast tworzyć jeden wyciąg użytkownika, można zrobić klasę jak Prefiks wyciąg z pierwszego parametru argumentu startswith a następnie użyć go lubię: 'val BandBangBangString = new PrefixExtractor ("!!!") ' – Chad

0

Dobre pytanie! Nawet ja próbowałem dużo, aby znaleźć odpowiedź.

Oto 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"; 
    } 
    } 
} 
+0

To odpowiada na inne pytanie. –

Powiązane problemy