我得到了两个列表,我需要检查站点列表中的任何项目是否在 ignoredSites 中。当我运行下面的代码时,它只打印出 google.co.uk 但是,它不应该也打印出 amazon.co.uk 和 groovy-lang.org 吗?

谁能解释一下为什么不行

def ignoredSites = ["www.amazon.com", /amazon.co.*/, /www.scala-lang.org/,/google.co.uk/, ~/htt(p|ps):\/\/www\.amazon\.co.*/, "groovy-lang.org"] 
def sites = ["amazon.co.uk", ~/groo{2}vy-lang\.org/, "google.co.uk", "amazon.com", ~/scala.*/] 
 
 
sites.each { site -> 
    ignoredSites.contains(site) ? println("Ignored: ${site}") : "" 
} 

请您参考如下方法:

首先,您在数组中混合了正则表达式和字符串。我建议您将它们放在单独的列表中。 其次要注意 groovy slashy strings。

我修改了你的代码以便你看到slashy strings (amazon.co.*、www.scala-lang.org、google.co.uk)实际上被解释为字符串,而不是预期的正则表达式。

在您的情况下,由于您在数组中混合了正则表达式和字符串,因此必须以不同的方式进行检查:

def ignoredSites = ["www.amazon.com", /amazon.co.*/, /www.scala-lang.org/,/google.co.uk/, ~/htt(p|ps):\/\/www\.amazon\.co.*/, "groovy-lang.org"] 
def sites = ["amazon.co.uk", ~/groo{2}vy-lang\.org/, "google.co.uk", "amazon.com", ~/scala.*/] 
 
 
println '==========sites============' 
sites.each { site -> 
  println site.toString() + " == "+ site.class 
} 
println '==========ignoredSites============' 
ignoredSites.each { site -> 
  println site.toString() + " == "+ site.class 
} 
println '======================' 
 
sites.each { site -> 
     if(site.class.equals(java.util.regex.Pattern)){ 
       ignoredSites.each{ is -> 
         if(is.class.equals(java.lang.String)){ 
           if(is.matches(site)) println("Ignored: ${site}") //string = regex 
         } else { 
           //can't match 2 regex 
         } 
       } 
     } else { 
       ignoredSites.each{ is -> 
         if(is.class.equals(java.lang.String)){ 
           if(is.equals(site)) println("Ignored: ${site}") //string = regex 
         } else { 
           if(site.matches(is)) println("Ignored3: ${site}") //string = regex 
         } 
       } 
     } 
} 

已编辑

如果你运行代码,打印元素类型,你会注意到以下事情:

==========sites============ 
amazon.co.uk == class java.lang.String 
groo{2}vy-lang\.org == class java.util.regex.Pattern 
google.co.uk == class java.lang.String 
amazon.com == class java.lang.String 
scala.* == class java.util.regex.Pattern 
==========ignoredSites============ 
www.amazon.com == class java.lang.String 
amazon.co.* == class java.lang.String 
www.scala-lang.org == class java.lang.String 
google.co.uk == class java.lang.String 
htt(p|ps)://www\.amazon\.co.* == class java.util.regex.Pattern 
groovy-lang.org == class java.lang.String 
====================== 

因此,amazon.co.uk 不匹配,因为应该匹配它的正则表达式:

amazon.co.* == class java.lang.String 

被 groovy 解释为 String,因为有斜杠字符串。 另一方面

groo{2}vy-lang\.org == class java.util.regex.Pattern 

是一个正则表达式,但其中的 {2} 表示 o 恰好出现了 2 次。 简而言之,groo{2}vy-lang\.org 将匹配 grooovy-lang.org(请注意其中的三个 o)。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!