regex - Groovy:如何检查列表是否包含另一个列表中包含正则表达式格式的项目
问题描述
我得到了两个列表,我需要检查站点列表中的任何项目是否在被忽略的站点中。当我运行下面的代码时,它只会打印出 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}") : ""
}
解决方案
首先,您在数组中混合正则表达式和字符串。我建议您将它们放在单独的列表中。其次要注意时髦的斜线字符串。
我修改了您的代码,以便您看到斜线字符串(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 将其解释为字符串。另一方面
groo{2}vy-lang\.org == class java.util.regex.Pattern
是一个正则表达式,但{2}
在其中,意味着 o 恰好出现 2 次。简而言之,groo{2}vy-lang\.org
将匹配grooovy-lang.org
(请注意其中的三个 o)。
推荐阅读
- mysql - 当表与 find_in_set() 连接时,Max(date) 不起作用
- sql-server - SQL Server 在 xml 数据类型上查询标签中存在的值
- python - 如何为烧瓶和芹菜应用程序创建一个通用的基础 docker 映像
- python - 导入错误:同一路径上没有名为 Error 的模块
- cakephp - cakePHP 的 process() 函数是否应该运行多次?
- python - 为什么 Python 中的 ==np.nan 从不工作?
- angular - 角度材料垫按钮切换组默认值未设置为未定义
- python - Pip 没有安装我个人应用程序的最新依赖项
- jersey - 包 javax.annotation.security 不存在
- c# - 自定义 Asp.Net Core ApiAuthorizationDbContext 表名