0

Java では、複数String[]のファイルパスがあります。String[]指定された正規表現に一致するすべての文字列を含むバックを取得する関数が必要です。

Javaにはそのための組み込み関数がありますか、それとも自分で行う必要がありますか?

4

3 に答える 3

6

Java SE には、文字列配列を操作する関数はありません。ただし、ファイルシステムを直接操作する場合は、使用できます

    String[] files  = new File("dir").list(new FilenameFilter() {
        @Override
        public boolean accept(File dir, String name) {
            return name.matches(regex);
        }
    });
于 2013-01-08T15:38:18.757 に答える
6

ループを実行して、文字列ごとに文字列をチェックする必要があります

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();
}
于 2013-01-08T15:38:41.813 に答える
2

私がすることの 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"));
}
于 2013-01-08T16:31:42.487 に答える