使用regex.pattern过滤列表

时间:2014-08-04 13:01:08

标签: java regex filter

我需要使用regex.Pattern过滤一个充满网址的列表。现在我有一个类型。

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());
        }   
}

2 个答案:

答案 0 :(得分:0)

使用此正则表达式:

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()) {...}

答案 1 :(得分:0)

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

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

在while循环中为urls列表使用迭代器。

说明:

urls包含字符串&#34; http://facebook.com&#34;和字符串&#34; meteo.com&#34;。

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

    字符串匹配url-pattern,urls.remove(0)称为

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

    我不小于urls.size() - &gt;留下循环,不会检查网址中的第二个字符串