2008-10-24 114 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); 

    } 
} 
相关问题