2016-08-03 23 views
1

Ich möchte einige saubere pattern-matching Code schreiben.Übereinstimmung zwischen den Werten der Liste

Ich habe ein List von Regex:

myInputString match { 
    case matchAnyRegexFromMyList(s) => //do something 
} 

Als Alternative zu:

val myList = List(
    ".+\\.a".r, 
    ".+\\.b".r, 
    ".+\\.c".r.+ 
) 

ich so etwas wie folgendes tun möchte

myInputString match { 
    case regex1(a)|regex2(b)... => //do something 
} 

Ist es an Am wenigsten möglich, um prägnanter zu sein?

Antwort

3

Wenn Ihr Muster nicht im Voraus erstellt wurden Sie sie kombinieren können, wenn sie kompiliert werden.

val myList = List(".+\\.a" 
       , ".+\\.b" 
       , ".+\\.c") 

val myListRE = myList.mkString("|").r 

"blah.b" match { 
    case myListRE() => println("hit") 
} 
3

Es ist nicht möglich, zur Laufzeit Case-Klauseln zu generieren. Sie könnten ein Makro schreiben, um sie zur Kompilierzeit zu erstellen.

können Sie eine benutzerdefinierte Extraktor obwohl verwenden:

case class MultiPattern(patterns: List[Regex]) { 
    def unapply(s: String): Option[String] = 
    patterns.flatMap(_.findFirstIn(s)).headOption 
} 

val myMultiPattern = MultiPattern(myList) 

val myInputString = "x.b" 
myInputString match { 
    case myMultiPattern(s) => println(s) // output: x.b 
} 
+0

könnte natürlich auch dies parametrisieren und dann ein 'val' verwenden, um die Konstante zu erstellen. –

+0

Danke für den Hinweis; Ich habe die Antwort aktualisiert. – devkat