2016-07-20 3 views
1

Я не использую сопоставление шаблонов так часто, как должен. Я соответствие доменного имени для следующих целей:Образец, соответствующий доменному имени

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 
    } 
} 

Как ссылаться на значение (request.domain) внутри выражения и посмотреть, если он начинается с «WWW.» как:

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

1. Вы против рекурсивного метода? 2. Что должно произойти с 'www.blog.example.com'? – childofsoong

+0

@childofsoong Мне не нужно поддерживать этот случай, только 1 уровень поддоменов. – Blankman

ответ

3

Вы можете дать переменную, шаблон, соответствующий имени и Scala будет определить его тип, а также вы можете поместить, если заявление в вас случае выражение как следует

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 
} 
} 

Обратите внимание, что порядок выражений случая имеет значение.

+0

Его не волнует, что он начинается с «блога», он заботится о том, чтобы он заканчивался на «example.com» или «example.org» – childofsoong

+1

Или, скорее, что он содержит их (предположительно в конце) – childofsoong

+0

@childofsoong I см., thx Я его отредактировал. –

1

При написании case положения вы можете сделать что-то вроде:

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

Это должен сделать довольно ясно, как захват совпавших значений работы. Так что в этом случае вам нужно будет написать что-то вроде:

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

Если ты мертв набор на использовании регулярных выражений, а не String методы, такие как startsWith и contains, вы можете сделать следующее:

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 
    } 
} 

Теперь, ради ремонтопригодность, я бы не идти по этому пути , потому что через месяц я буду смотреть на это и не помню, что он делает, но это ваш звонок.

0

вам не нужно шаблон соответствия для этого:

request.domain 
    .stripPrefix("www.") 
    .stripSuffix(".example.org") 
    .stripSuffix(".example.com") 
Смежные вопросы