使用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