[英]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”。
迭代步骤:i == 0和urls.size()== 2
字符串匹配url-pattern和urls.remove(0)被调用
迭代步骤:i == 1和urls.size()== 1
我不小于urls.size()->循环播放,不会检查url中的第二个字符串
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.