在 Java 中,我有一个String[]
文件路径。我需要一个函数来获取String[]
返回值,其中包含与指定正则表达式匹配的所有字符串。
Java 是否有一个内置函数或者我必须自己做这个?
Java SE 中没有这样的函数来处理字符串数组。但是,如果您直接使用文件系统,那么您可以使用
String[] files = new File("dir").list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.matches(regex);
}
});
你必须做一个循环并逐个字符串检查
public static void main(String args[]) {
String[] a = {"1", "a", "b" };
List<String> b = new ArrayList<String>();
for (int i=0; i<a.length; i++) {
if (a[i].matches("(a|b)")) { // matches uses regex
System.out.println("Match " + a[i]);
b.add(a[i]);
}
}
}
点赞乞丐:
public static void main(String args[]) {
String[] a = {"1", "a", "b" };
String [] res;
List<String> b = new ArrayList<String>();
Pattern p = Pattern.compile("(a|b)");
Matcher m;
for (int i=0; i<a.length; i++) {
m = p.matcher(a[i]);
if (m.matches()) {
System.out.println("Match " + a[i]);
b.add(a[i]);
}
}
res = (String[]) b.toArray();
}
更清洁:
private static String[] getMatches(String[] strings) {
Pattern p = Pattern.compile("(a|b)");
List<String> matches = new ArrayList<String>();
for (String s : strings) {
if (p.matcher(s).matches()) {
matches.add(s);
}
}
return (String[]) matches.toArray();
}
我要做的一件事是将字符串数组变成一个列表对象。
List<String> listFiles = Arrays.asList(strFiles);
正如 beder 所指出的,迭代 for 循环示例可能是最简单和最安全的方法。
仅使用标准库的唯一其他方法是创建一个迭代器对象并从列表中删除任何不匹配的元素。
//Sudo-code
Iterator<String> iterator = listFiles.iterator();
Pattern pattern = new Pattern("foo");
while(iterator.hasNext()){
String file = iterator.next();
Matcher matcher = pattern.matcher(file);
if(!matcher.matches()){
iterator.remove();
}
}
在标准库之外,您可能想看看一些函数式编程库。Apache-commons、Guava 和 lambdaJ 是唯一能想到的。
匹配器只是一个谓词函数,因此您可以轻松地环绕称为过滤器的高阶函数。此示例是使用 apache-commons 语法编写的。他们如何制作谓词和闭包对象有一些样板。如果您想要更清洁的东西,请使用 lambbdaJ,因为它构建在 hamcrest 之上。
public class MatchesPattern implements Predicate{
Pattern pattern;
public MatchesPattern(String strPattern){
this.pattern = new Pattern(strPattern);
}
@Override
public boolean evaluate(Object input) {
if( input instanceof String){
Matcher matcher = pattern.matcher((String)input);
return matcher.matches();
}
return false;
}
}
public void foo(String[] strFiles){
List<String> files = Arrays.asList(strFiles);
CollectionUtils.filter(files, new MatchesPattern("bar"));
}