为什么Regex模式匹配有时在Scala中不起作用

时间:2017-01-18 13:27:53

标签: scala

我正在尝试在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
  }
}

1 个答案:

答案 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