Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用regex和scala匹配域名_Regex_Scala - Fatal编程技术网

使用regex和scala匹配域名

使用regex和scala匹配域名,regex,scala,Regex,Scala,我试过这个问题的正则表达式: 但是找不到域名。以下是我的实现: 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) ca

我试过这个问题的正则表达式:

但是找不到域名。以下是我的实现:

    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实现有问题吗?

我通过在扩展之前添加一个
来修复正则表达式。顺便说一句,由于您必须获得您感兴趣的组(即#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)
编辑:对不起,我误读了你的问题。我重写了答案

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…)部分之间添加“.”。你认为圆点是一个边界
  • 您不希望(com | net…)部分定义捕获组,因此使用(?:…)而不仅仅是(…)
  • 我在最后取出了美元。那可能是无缘无故的

祝你好运

我会使用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)
这种方法的问题是,您总是需要用一个变量捕获每个组。要禁用此功能,您需要显式添加一个非捕获组(以
?:
开头):

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

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

scala> val r".*?([^.]+)$domain\.(?:com|net|org|co\.uk)" = "www.google.com"
domain: String = google

regex对我不起作用,'www.google.com'被打印出来,'google'应该被打印出来编辑答案(我读你的问题太快了)。这个应该可以:)
scala> val r".*?([^.]+)$domain\.(?:com|net|org|co\.uk)" = "www.google.com"
domain: String = google