2013-08-12 1 views
1

Supposons que j'ai des fichiers comme ceux-ci dans un dossier:Android trouver un fichier avec un motif (regex)

  • myfile_mark_1.mp4
  • myfile_john_2.mp4
  • myfile_jake_3.mp4
  • myfile_tristan_4.mp4
  • yourfile_mark_1.mp4

Comment puis-je trouver des fichiers où seulement t qu'il nomme contenant "myfile_" dans le préfixe et le suffixe seraient 3 ou moins ( "_3.mp4", "_2.mp4", "_1.mp4", quelque chose comme ça).

Donc dans mon programme que je pourrais obtenir:

  • myfile_mark_1.mp4
  • myfile_john_2.mp4 et
  • myfile_jake_3.mp4

J'ai essayé celui-ci, dans l'espoir d'obtenir la chance mais je n'ai obtenu aucun résultat. : D

String myDirectory = Environment.getExternalStorageDirectory().getAbsolutePath(); 
File f = new File(myDirectory); 
if (f.exists() && f.isDirectory()){ 
    final Pattern p = Pattern.compile("myfile_*\\_(^0*(1?\\d|%d)$).mp4"); // I know I really have a stupid mistake on the regex; 

    File[] flists = f.listFiles(new FileFilter(){ 
     @Override 
     public boolean accept(File file) { 
      return p.matcher(file.getName()).matches(); 
     } 
    }); 

    String s = "wait a minute, i'm debugging"; 
} 

J'espère que quelqu'un peut aider sur mon problème.

+0

S'il vous plaît publier votre chemin Mydirectory –

+0

Salut Yogesh, s'il vous plaît voir mon edit .. Je viens de mettre les fichiers de la carte SD sans sous-dossiers juste pour tester. merci – junmats

Répondre

4

La regex requise est assez simple.

myfile_.*_[123]\\.mp4 
+1

je vous remercie pour la réponse simple..Juste ce dont j'avais besoin :) – junmats

+0

@junmats Content de vous aider. –

+0

@Downvoter: S'il vous plaît prendre soin de commenter. –

0

Essayez quelque chose comme ceci. Je pense que c'est facile

String fileName="myfile_mark_1.mp4"; 
    if(fileName.startsWith("myfile")){ 
     if(Integer.parseInt(fileName.split("_")[2].substring(0,1))<=3){ 
      System.out.println(fileName); 
     } 
    } 

Suivant va retourner tous les fichiers de votre ordinateur correspondent à vos critères.

public static void main(String[] args) { 
    File[] paths = File.listRoots(); 
    for(File directory:paths){ 
     getFile(directory.toString()); 
    } 
} 

public static void getFile(String directoryName) { 
    File directory = new File(directoryName); 
    File[] fList = directory.listFiles(); 
    if(fList!=null){ 
     for (File file : fList) { 
      if (file.isFile()) { 
       if(file.getName().toString().startsWith("myfile")){ 
        if(Integer.parseInt(file.getName().toString().split("_")[2].substring(0,1))<=3){ 
         System.out.println(file.getName().toString()); 
        } 
       } 
      } else if (file.isDirectory()) { 
       getFile(file.getAbsolutePath()); 
      } 
     } 
    } 

} 
+0

oui, je pourrais faire comme celui-là, mais les fichiers pourraient être plus d'une centaine à la longue et je ne pense pas boucler à travers les fichiers entiers pour trouver mes fichiers est bon. Mais je considère beaucoup votre réponse. merci – junmats

+0

@junmats vérifier ma réponse éditée. Est-ce que cela fonctionne pour vous? –

1

Si vous voulez faire cela avec un Pattern, voici un exemple de travail, depuis le Pattern que vous utilisez a beaucoup de problèmes.

String mark = "myfile_mark_1.mp4"; 
String john = "myfile_john_2.mp4"; 
String jake = "myfile_jake_3.mp4"; 

Pattern pattern = Pattern.compile("myfile_\\p{Alpha}+_\\d+\\.mp4"); 
Matcher matcher = pattern.matcher(mark); 
System.out.println(matcher.find()); 
matcher = pattern.matcher(john); 
System.out.println(matcher.find()); 
matcher = pattern.matcher(jake); 
System.out.println(matcher.find()); 

Sortie:

true 
true 
true 

questions que je trouve dans les Pattern que vous utilisez:

  • J'interprété la partie ^0 comme un caractère de départ en option. Le caractère ^ peut signifier le début de toute l'entrée, ou la négation d'un caractère ou d'un groupe (qui ne fonctionne que dans les classes de caractères). Le . dans votre Pattern doit être échappé.
  • Vous ne savez pas ce que le %d signifie dans votre Pattern, car il ne reflète rien dans vos exemples. Est-ce parce que vous voulez regrouper les numéros et les référencer? Dans ce cas, vous pouvez envelopper votre expression numérique autour de parenthèses - ce sera votre groupe index-1 dans ce cas.
3

essayez ceci: -

String myDirectory = Environment 
     .getExternalStorageDirectory().getAbsolutePath(); 
File f = new File(myDirectory); 
if (f.exists() && f.isDirectory()) { 
    final Pattern p = Pattern.compile("yourfile_.*_[123]\\.png"); 
File[] flists = f.listFiles(new FileFilter() { 
    @Override 
    public boolean accept(File file) { 
     p.matcher(file.getName()).matches(); 
     Log.e("MIS", "sdsdsdsds" + p.matcher(file.getName()).matches()); 

     return p.matcher(file.getName()).matches(); 

    } 
}); 
String s = "wait a minute, i'm debugging"; 

}

+0

junmats obtenu la solution ??? –

+0

votre réponse et ravi sont les mêmes, mais je pense que je dois lui donner depuis qu'il a répondu en premier. +1 pour ma gratitude. Merci! – junmats

Questions connexes