4

ユーザーが検索パターン(任意の有効な正規表現)を入力でき、同じものに一致するファイル名が返されるファイル検索プログラムを作成したかったのです。

たとえば、 MFile123.txはUMFile123.txtとAIIMFile123.txsを検索します

次のことを試しましたが、機能しませんでした。

import java.util.regex.*;
public class regexTest {
    public static void main(String... a){
        String file="UMFile123.txt";
       //String pattern="*MFile*.tx?"; TRIED with \*MFile*.tx , but no use
        String pattern="UMFile*.tx?";
        Pattern p=Pattern.compile(pattern);
        Matcher m=p.matcher(file);
        if(m.matches()){
            System.out.println("Hi!it matches!!");
        }
    }
}
4

4 に答える 4

2

正規表現は次のようになります。

.*MFile123\.tx.*

.*前後の任意の数字に一致しますMFile123.tx

.また、 txの前にエスケープする必要があります。

.任意の文字を指します。

*その前の特定の文字の0回以上の出現を指します

つまり、.*0個以上の文字に一致することを意味します

于 2012-10-11T06:25:56.640 に答える
2

私は次のように正規表現を使用します:.*MFile123\.tx.*

これは次のように分類されます:ゼロ以上の何か(.*)、MFile123続いてリテラル.(エスケープ)、txその後にゼロ以上の何か(.*

于 2012-10-11T06:27:58.387 に答える
1

最も簡単な解決策は、ユーザーが入力したファイル名/パターンを「引用」または「エスケープ」し、その前にaを追加して追加する.*?ことです。何かのようなもの:

final String userFname = "MFile123.tx";
final String escapedName = Pattern.quote(userFname);
final String fnamePattern = ".*?" + escapedName + ".*";
final Pattern pat = Pattern.compile(fnamePattern);
final Matcher m = pat.matcher(file);

ここで他の回答で述べられているように、手動でエスケープするビジネスには行きたくありません。私見を正しくするのは難しい。大文字と小文字を区別しない一致が必要な場合は、大文字と小文字を区別しない正規表現フラグの1つをスローするだけで、問題はありません。

于 2012-10-11T06:31:41.723 に答える
0

File.listFiles(FileFilter)を使用できます。理解を深めるために、以下の例をご覧ください。

package com.stackoverflow.works;

import java.io.File;
import java.io.FileFilter;
import java.text.SimpleDateFormat;
import java.util.regex.Pattern;

/*
 * @Author: sarath_sivan
 */

public class FileSearchService {

    /*
     * @Description: Method used to List the files
     * @param: directory File, regex String
     * @return: fileList File[]
     */
    public static File[] search(File directory, String regex) {
        if(!directory.isDirectory()) {
            throw new IllegalArgumentException(directory+" is no directory.");
        }

        final Pattern pattern = Pattern.compile(regex); // Caution: could also throw an exception!
        return directory.listFiles(new FileFilter(){
            @Override
            public boolean accept(File file) {
                return pattern.matcher(file.getName()).matches();
            }
        });
    }

    /*
     * @Description: Method used to print the File List
     * @param: fileList File[]
     * @return: void
     */
    public static void printFileList(File[] fileList) {
        for (File file : fileList) {
            System.out.println("File Name: " + file.getName());
            System.out.println("Absolute Path: " + file.getAbsolutePath());
            System.out.println("Last Modified: " + getLastModifiedTimestamp(file));
            System.out.println();
        }
    }

    /*
     * @Description: Method used to get the Last Modified Timestamp
     * @param: file File
     * @return: void
     */
    public static String getLastModifiedTimestamp(File file) {
        SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        return sdf.format(file.lastModified());
    }

    /*
     * @Description: Main method used to test the Regex File listing logic
     * @param: fileList File[]
     * @return: void
     */
    public static void main(String[] args) {

        String directoryPath = "C:/Users/sarath_sivan/Desktop";
        File directory = new File(directoryPath);
        String regex = "([^\\s]+(\\.(?i)(jpg|png|gif|bmp))$)"; //Regular Expression pattern for image file extension

        File[] fileList = search(directory, regex);
        printFileList(fileList);

    }

}

このコードは、正規表現を使用して特定のディレクトリ内の画像ファイルを一覧表示します。サンプル出力は次のようになります。

出力

于 2012-10-11T09:13:13.000 に答える