2008-10-24 78 views
4

我試圖想出一個Java正則表達式,它只會匹配一個文件名,如果它有一個有效的擴展名。例如它應該匹配「foo.bar」和「foo.b」,但不是「foo」。也不是「富」。Java文件擴展名正則表達式

我已經寫了下面的測試程序

public static void main(String[] args) { 
    Pattern fileExtensionPattern = Pattern.compile("\\.\\w+\\z"); 

    boolean one = fileExtensionPattern.matcher("foo.bar").matches(); 
    boolean two = fileExtensionPattern.matcher("foo.b").matches(); 
    boolean three = fileExtensionPattern.matcher("foo.").matches(); 
    boolean four = fileExtensionPattern.matcher("foo").matches(); 

    System.out.println(one + " " + two + " " + three + " " + four); 
} 

我預計這將打印「真真的虛假」,而是它打印所有4個僞。我哪裏錯了?

乾杯, 唐

回答

10

Matcher.matches()功能嘗試匹配針對整個輸入的模式。因此,您必須將.*添加到您的正則表達式的開頭(最後\\Z也是多餘的),或者使用find()方法。

+0

剛剛昨天就打我了。 – agnul 2008-10-24 16:55:35

+0

此外,唐可能會考慮在FileFilter中包裝他的正則表達式: http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileFilter.html – 2008-10-25 04:10:08

8
public boolean isFilename(String filename) { 
    int i=filename.lastInstanceOf("."); 
    return(i != -1 && i != filename.length - 1) 
} 

會快得多,不管你做什麼,把它放在一個方法中會更具可讀性。

0
package regularexpression; 

import java.io.File; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegularFile { 
    public static void main(String[] args) { 
     new RegularFile(); 
    } 

    public RegularFile() { 

     String fileName = null; 
     boolean bName = false; 
     int iCount = 0; 
     File dir = new File("C:/regularfolder"); 
     File[] files = dir.listFiles(); 
     System.out.println("List Of Files ::"); 

     for (File f : files) { 

      fileName = f.getName(); 
      System.out.println(fileName); 

      Pattern uName = Pattern.compile(".*l.zip.*"); 
      Matcher mUname = uName.matcher(fileName); 
      bName = mUname.matches(); 
      if (bName) { 
       iCount++; 

      } 
     } 
     System.out.println("File Count In Folder ::" + iCount); 

    } 
} 
相關問題