我试图在Scala 2.11.8中提取url的主机名.由于某种原因,模式匹配方法不起作用,我无法弄清楚为什么:(
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
}
}
Run Code Online (Sandbox Code Playgroud)
在Scala中,默认情况下会锚定正则表达式- 如果您将其设为unanchored,则可以使用:
val HOSTNAME = "^http[s]:\\/?\\/?([^:\\/\\s]+)".r.unanchored
Run Code Online (Sandbox Code Playgroud)
结果将是Some(foo-bar.hostname.com)(我假设你正在尝试匹配).
或者 - 在下一个斜杠之后添加一个匹配任何东西的零件:
val HOSTNAME = "^http[s]:\\/?\\/?([^:\\/\\s]+)\\/.*".r
Run Code Online (Sandbox Code Playgroud)
会返回相同的结果.
最后 - 如果您只想解析标准URI,可以使用java.net.URI:
URI.create(text).getHost // returns foo-bar.hostname.com
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |