2012-10-11 45 views
3

我想寫一個文件搜索程序,用戶可以輸入serach模式(任何有效的正則表達式),並返回匹配的文件名。在java中匹配文件名與量詞

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!!"); 
     } 
    } 
} 
+0

手動去除的東西是*不*爲其他的答案在這裏提到一個好主意。看看我的答案中使用的'quote'方法的用法。 –

回答

1

最簡單的解決方案是「引用」或「轉義」用戶輸入的文件名/模式,並且預先&將.*?附加到它。例如:

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); 

我寧可不去與手動轉義的業務,如其他答案所述。整蠱得到正確的恕我直言。如果你想要不區分大小寫的匹配,只需輸入insensitive regex flags之一,你應該很好。

+0

謝謝桑傑!但問題是一樣的。例如,如果filename-> UMFile123.txt和pattern-> U * .txt,則不會發生匹配.SOP是:excapedname:\ QU * .txt \ E filename-> test.txt} {fnamePattern - >。*? \ QU * .txt \ E. *請幫忙。 –

+0

我想我誤解了你的問題。你需要的是「glob」模式匹配,而不是正則表達式匹配。看看[這個問題](http://stackoverflow.com/questions/1247772/is-there-an-equivalent-of-java-util-regex-for-glob-type-patterns)它提供了一個現成的解決方案與替代品。 –

1

正則表達式應該是:

.*MFile123\.tx.* 

.*匹配前後的任意數字字符MFile123.tx

你也需要TX之前逃脫.因爲

.是指任何字符。

*是指它

所以,.*意味着匹配0個或更多字符數之前零個或多個特定字符的出現

+0

不禁注意到你在那裏複製了我的正則表達式。我會拿這個作爲恭維,〜) –

+0

@BillyMoon嗯..這只是一個巧合.. :) – Anirudha

+0

謝謝Anirudha!有效。但這裏的模式是用戶輸入。 As *表示零個或多個字符和?意味着零或一個,所以如果模式用戶輸入* MFile123 * .tx?應該匹配UMFile123.txt和AIIMFile123.txs。 –

1

我會按如下方式使用正則表達式:.*MFile123\.tx.*

這打破了作爲:零個或更多的任何東西(.*),然後是MFile123,然後是文字.(轉義),然後是tx,然後是零個或多個任何東西(.*

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); 

    } 

} 

此代碼列出與正則表達式指定目錄下的圖像文件。輸出示例如下所示:

output