2

我已经尝试过这个问题的正则表达式:如何从 URL 获取域名

但是没有找到域名。这是我的实现:

    val Names = """.*([^\.]+)(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$""".r
    val s = Names.findFirstIn("www.google.com")
    s match {
    case Some(name) =>
        println(name)
    case None =>
        println("No name value")
    }

“无名称值”始终打印到标准输出。正则表达式或我的 Scala 实现是否有问题?

4

3 回答 3

2

我会使用 Scalas 2.10 字符串插值功能:

implicit class Regex(sc: StringContext) {
  def r = new util.matching.Regex(sc.parts.mkString, sc.parts.tail.map(_ => "x"): _*)
}

scala> "www.google.co.uk" match {
      case  r"(.*?)$sld([^.]+)$domain\.(com|net|org|co\.uk)$tld" => (sld,domain,tld)
      case _ => ???
    }
res61: (String, String, String) = (www,google,co.uk)

这种方法的问题是您总是需要用一个变量来捕获每个组。要禁用此功能,您需要显式添加一个非捕获组(以 开头?:):

r".*?([^.]+)$domain\.(?:com|net|org|co\.uk)"

对于第一组,也可以完全忽略它。

如果您确定可以始终匹配输入字符串,也可以省略模式匹配的不匹配部分:

scala> val r".*?([^.]+)$domain\.(?:com|net|org|co\.uk)" = "www.google.com"
domain: String = google
于 2013-05-16T10:42:53.257 回答
2

.我通过在扩展之前添加 a 来修复正则表达式。顺便说一句,由于您必须获得您感兴趣的组(#1),您应该使用findFirstMatchIn而不是findFirstIn.

val Names = """([^.]+)\.(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$""".r
val s = Names.findFirstMatchIn("www.google.com")
s match {
case Some(name) =>
  println(name)
  println(name.group(1))
case None =>
    println("No name value")
}

印刷:

google.com
google
Names: scala.util.matching.Regex = ([^.]+)\.(com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)$
s: Option[scala.util.matching.Regex.Match] = Some(google.com)

编辑:对不起,我误读了你的问题。我重写了答案。

于 2013-05-16T10:01:16.820 回答
1
scala> val Names = """.*?([^\.]+)\.(?:com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)""".r
Names: scala.util.matching.Regex = .*?([^\.]+)\.(?:com|net|org|info|coop|int|co\.uk|org\.uk|ac\.uk|uk|__and so on__)

scala> val Names( primary ) = "www.google.com"
primary: String = google

变化:

  • 注意 ? 在最初的 .* 之后——贪心匹配可以一直匹配到 e.com,所以关闭它!
  • 添加 '。' 在您想要的组和 (com|net...) 部分之间。您希望 dot 成为那里的边界
  • 您不希望 (com|net...) 部分定义捕获组,因此请使用 (?:...) 而不仅仅是 (...)
  • 我在最后删除了 $ 。那可能是无缘无故的。

祝你好运!

于 2013-05-16T10:40:58.810 回答