我正在尝试在Scala 2.11.8中提取网址的主机名。由于某种原因,模式匹配方法不起作用,我无法弄清楚原因:(
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
}
}
答案 0 :(得分:5)
在Scala中,默认情况下正则表达式锚定 - 如果您将其取消固定,则可以使用:
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