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();
}
私がすることの 1 つは、文字列配列をリスト オブジェクトにすることです。
List<String> listFiles = Arrays.asList(strFiles);
ベダーが指摘したように、繰り返しの 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 だけが頭に浮かびます。
マッチャーは単なる述語関数であるため、filter と呼ばれる高階関数を簡単にラップできます。この例は、apache-commons 構文を使用して記述されています。彼らがどのように述語とクロージャーオブジェクトを作るかには、いくつかのボイラープレートがあります。もう少しクリーンなものが必要な場合は、hamcrest の上に構築されている lambbdaJ を使用してください。
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"));
}