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

rei*_*kje 1 scala

我试图在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)

Tza*_*har 5

在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)