2017-01-18 2 views
0

Я пытаюсь извлечь имя хоста в Scala 2.11.8. По какой-то причине шаблона подход не работает, и я не могу понять, почему :(Почему соответствие шаблону Regex иногда не работает в Scala

val HOSTNAME = "^http[s]:\\/?\\/?([^:\\/\\s]+)".r 
val text = "https://foo-bar.hostname.com/" 

// evaluates to None 
val host: Option[String] = { 
    text match { 
    case HOSTNAME(h) => Some(h) 
    case _ => 
     None 
    } 
} 

// evaluates to Some(foo-bar.hostname.com) 
val host: Option[String] = { 
    val matcher = HOSTNAME.findAllIn(text) 
    if (matcher.hasNext && matcher.groupCount > 0) { 
    Some(matcher.group(1)) 
    } else { 
    None 
    } 
} 

ответ

4

В Scala, регулярные выражения якорь по умолчанию - если вы сделаете это unanchored это будет работать:

val HOSTNAME = "^http[s]:\\/?\\/?([^:\\/\\s]+)".r.unanchored 

Результат будет Some(foo-bar.hostname.com) (я предполагаю, что это то, что вы пытаетесь соответствовать)

в качестве альтернативы - добавить часть, которая соответствовала бы что-нибудь после следующей косой черты:.

val HOSTNAME = "^http[s]:\\/?\\/?([^:\\/\\s]+)\\/.*".r 

Вернул бы тот же результат.

Наконец - если вы просто хотите, чтобы разобрать стандартные идентификаторы URI, вы можете использовать java.net.URI:

URI.create(text).getHost // returns foo-bar.hostname.com 
+0

Великий ответ, спасибо большое! – reikje

Смежные вопросы