2011-07-17 4 views

Trả lời

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

Vì vậy suffix sẽ được áp dụng với phần còn lại của chuỗi, hoặc một scala.MatchError bị ném.

Một biến thể khác nhau sẽ là:

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

prefix một trong hai sẽ phù hợp với !!! hoặc là null. ví dụ.

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

Ở trên phức tạp hơn một chút so với bạn có thể cần, nhưng đáng xem xét sức mạnh tích hợp regexp của Scala.

9

Nếu đó là loại điều bạn làm thường xuyên, nó có thể là giá trị tạo ra một vắt

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

Sau đó, bạn có thể sử dụng vắt như sau

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

hoặc thậm chí

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

thay vì làm một vắt sử dụng duy nhất, bạn có thể làm cho một lớp học như Prefix vắt với tham số đầu tiên của lập luận startsWith và sau đó sử dụng nó như: 'val BandBangBangString = new PrefixExtractor ("!!!") ' – Chad

0

Câu hỏi hay! Thậm chí tôi đã cố gắng rất nhiều để tìm ra câu trả lời.

Đây là một 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

Câu trả lời cho một câu hỏi khác. –