2016-07-30 9 views
0

Ich habe mit Pattern-Matching folgende regex:Scala: regex direkt in Pattern-Matching Block

val url = "/en/about" 
val langRegex = "/(.{2}).*".r 

val lang = url match { 
    case langRegex(lang) => lang 
    case _ => "en" 
} 

Aber ich möchte so etwas erreichen (ich will nicht für regex zusätzliche Variable erstellen, sondern setzen es direkt in passendem Block)

val url = "/en/about" 
val lang = url match { 
    case "/(.{2}).*".r(lang) => lang 
    case _ => "en" 
} 

Ich erhalte Compilerfehler im zweiten Fall? Ich habe gerade langRegex (lang) mit "/(.{2}).*".r ersetzt, sollten diese Ausdrücke gleich sein, sollte es nicht?

Warum ist das ein Fehler?

+1

Die Sache ist, dass Sie das einfach nicht tun können, Sie brauchen ein vorkompiliertes Muster. Was Sie tun können, ist entweder ein "if" innerhalb verwenden und einige String-Manipulation verwenden, wenn die Zeichenfolge Ihre Regex entspricht, oder einfach einen einfacheren Code wie in http://ideone.com/CJMS1A –

+0

verwenden Oder verwenden Sie ['case s if url .matches ("/ (. {2}). *") => s.replaceFirst ("/(.{2}).*", "$ 1") '] (http://ideone.com/dqlW4z) . –

Antwort

4

Dies funktioniert nicht, da nur Werte wie in http://scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html definiert übereinstimmen. Im ersten Beispiel entspricht Ihre Übereinstimmung der Form StableId ‘(’ [Patterns] ‘)’, wobei StableId eine value oder object ist, aber keine def, die sich jederzeit ändern könnte, wenn sie ausgeführt wird.

Ihr zweites Beispiel funktioniert nicht, weil "/(.{2}).*".r keine StableId ist. Ihr zweites Beispiel funktioniert nicht, weil das folgende Beispiel auch nicht funktioniert:

val url = "/en/about" 
def langRegex = "/(.{2}).*".r 

val lang = url match { 
    case langRegex(lang) => lang 
    case _ => "en" 
} 

wo ich geändert Ihre langRegex Definition zu einem def und es ist somit kein StableId mehr.

+0

danke, sehr nützlich. – Teimuraz

+0

@ moreo Sie können dies auch als akzeptierte Antwort überprüfen, wenn es Ihre Frage beantwortet –