繁体   English   中英

使用regex.pattern过滤列表

[英]Filter a list using regex.pattern

我需要使用regex.Pattern筛选完整的URL列表。 现在,我有这个用于类型。

private final static Pattern FILTERS_TYPE = Pattern.compile(".*(\\
(css|js|bmp|ico|gif|jpe?g" + "|png|tiff?|mid|mp2|mp3|mp4"
    + "|wav|avi|mov|mpeg|ram|m4v|pdf" + "|rm|smil|wmv|swf|wma|zip|rar|gz|jsp))$");

因此,我试图编写一个过滤器以排除“ facebook”,“ twitter”等网站。

private final static Pattern FILTERS_NAME =       Pattern.compile(".*facebook.*|.*quotidiani.*|.*meteo.*|.*twitter.*|.*hotel.*|.*mobile.*|"         + ".*histats:*"); 

但这不起作用。 “ filters_name”的正确语法是什么?

private List<WebURL> trash = new ArrayList<>(); //non obiettivo
private List<WebURL> urls = new ArrayList<>(); //obiettivo



public synchronized void collectorUrls(){

    for(int i =0; i<urls.size();i++){
        String indirizzo = urls.get(i).getURL().toLowerCase();
        if(FILTERS_TYPE.matcher(indirizzo).matches()){

            trash.add(urls.get(i));
            urls.remove(i);

            }
        if(FILTERS_NAME.matcher(indirizzo).matches()){


            trash.add(urls.get(i));
            urls.remove(i);

            }
        System.out.println(urls.get(i).getURL());
        }   
}

使用此正则表达式:

private final static Pattern FILTERS_NAME =  
         Pattern.compile("facebook|quotidiani|meteo|twitter|hotel|mobile|histats:"); 

然后更换Matcher.matches()由方法Matcher.find() 所以代替:

if(FILTERS_NAME.matcher(indirizzo).matches()) {...}

采用:

if(FILTERS_NAME.matcher(indirizzo).find()) {...}

哦,我认为您的问题是在迭代时从列表中删除项目。

当您从网址列表中删除网址时,urls.size()的值将减小。 结果是将永远不会检查列表中的最后一个URL。

在while循环中对URL列表使用迭代器。

说明:

urls包含字符串“ http://facebook.com ”和字符串“ meteo.com”。

  1. 迭代步骤:i == 0和urls.size()== 2

    字符串匹配url-pattern和urls.remove(0)被调用

  2. 迭代步骤:i == 1和urls.size()== 1

    我不小于urls.size()->循环播放,不会检查url中的第二个字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM