2016-07-20 9 views
1

Ich verwende Mustervergleich nicht so oft wie ich sollte. Ich bin passend einen Domain-Namen für die folgenden: „www“.Muster, das einem Domain-Namen entspricht

1. If it starts with www., then remove that portion and return. 
    www.stackoverflow.com => "stackoverflow.com" 
2. If it has either example.com or example.org, strip that out and return. 
    blog.example.com => "blog" 
3. return request.domain 
    hello.world.com => "hello.world.com" 

def filterDomain(request: RequestHeader): String = { 
    request.domain match { 
    case //?? case #1 => ? 
    case //?? case #2 => ? 
    case _ => request.domain 
    } 
} 

Wie verweisen ich den Wert (request.domain) innerhalb des Ausdrucks und sehen, ob es mit beginnt wie:

if request.domain.startsWith("www.") request.domain.substring(4) 
+0

1. Sind Sie gegen eine rekursive Methode? 2. Was soll mit "www.blog.example.com" geschehen? – childofsoong

+0

@childofsoong Ich muss diesen Fall nicht unterstützen, nur eine Ebene von Subdomains. – Blankman

Antwort

3

Sie die Variable geben können Sie Pattern-Matching einen Namen und Scala wird folgern, seine Art, plus Sie können in Ihnen Fall Ausdruck eine if-Anweisung setzen als folgt

def filterDomain(request: RequestHeader): String = { 
request.domain match { 
    case domain if domain.startsWith("www.") => domain.drop(4) 
    case domain if domain.contains("example.org") | domain.contains("example.com") => domain.takeWhile(_!='.') 
    case _ => request.domain 
} 
} 

Beachten Sie, dass die Reihenfolge der Fallausdrücke wichtig ist.

+0

Es ist ihm egal, dass es mit "Blog" beginnt, er kümmert sich, dass es in "example.com" oder "example.org" endet – childofsoong

+1

Oder vielmehr, dass es sie enthält (vermutlich am Ende) – childofsoong

+0

@childofsoong I sieh, thx Ich habe es bearbeitet. –

1

Wenn case Klauseln schreiben Sie können wie etwas tun:

case someVar if someVar.length < 2 => someVar.toLowerCase 

funktioniert dies sollte ziemlich deutlich machen, wie abgestimmt Werte greifen. So in diesem Fall würde man so etwas schreiben müssen:

case d if d.startsWith("www.") => d.substring(4) 
0

Wenn Sie einen regulären Ausdruck zur Verwendung anstatt String Methoden tot Set sind wie startsWith und contains, können Sie folgendes tun:

val wwwMatch = "(?:www\\.)(.*)".r 
val exampleMatch = "(.*)(?:\\.example\\.(?:(?:com)|(?:org)))(.*)".r 
def filterDomain(request: String): String = { 
    request.domain match { 
    case wwwMatch(d) => d 
    case exampleMatch(d1, d2) => d1 + d2 
    case _ => request.domain 
    } 
} 

Nun halber Wartbarkeit, würde ich nicht auf diese Weise gehen weil ich einen Monat später darauf schauen werde und mich nicht daran erinnern werde, was es tut, aber das ist dein Ruf.

0

Sie keine Muster für das passende benötigen:

request.domain 
    .stripPrefix("www.") 
    .stripSuffix(".example.org") 
    .stripSuffix(".example.com")