我需要使用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());
}
}
答案 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;。
迭代步骤:i == 0和urls.size()== 2
字符串匹配url-pattern,urls.remove(0)称为
迭代步骤:i == 1和urls.size()== 1
我不小于urls.size() - &gt;留下循环,不会检查网址中的第二个字符串