2008-10-24 7 views
4

J'essaye de trouver une regex Java qui ne correspondra à un nom de fichier que s'il a une extension valide. Par exemple, il devrait correspondre à "foo.bar" et "foo.b", mais ni "foo". ni "foo".Extension de fichier Java regex

J'ai écrit le programme de test suivant

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

Je m'y attendais pour imprimer "true true false false", mais il imprime faux pour les 4 cas. Où vais-je mal?

vôtre, Don

Répondre

10

La fonction Matcher.matches() tente de faire correspondre le motif contre l'entrée entière. Ainsi, vous devez ajouter .* au début de votre regex (et le \\Z à la fin est également inutile), ou utilisez la méthode find().

+0

Cela m'a frappé hier. – agnul

+0

En outre, Don pourrait envisager d'emballer son regex dans un FileFilter: http://java.sun.com/j2se/1.4.2/docs/api/java/io/FileFilter.html –

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

Serait significativement plus rapide et peu importe ce que vous faites, le mettre dans une méthode serait plus lisible.

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

    } 
} 
+0

Merci d'avoir posté une réponse! Alors qu'un extrait de code pourrait répondre à la question, il est toujours bon d'ajouter des informations complémentaires, comme expliquer, etc. – j0k

Questions connexes