Android查找带有模式的文件(正则表达式)

时间:2013-08-12 05:30:17

标签: java android regex filefilter

假设我在文件夹中有这样的文件:

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

如何找到前缀和后缀中只包含“myfile _”的名称 3或更少的文件( “_ 3.mp4”“_ 2.mp4”“_ 1.mp4”,类似这样的事情。)< / p>

所以在我的课程中我可以得到:

  • myfile_mark_1.mp4
  • myfile_john_2.mp4和
  • myfile_jake_3.mp4

我试过这个,希望幸运,但我没有得到任何结果。 :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";
}

我希望有人可以帮助解决我的问题。

4 个答案:

答案 0 :(得分:4)

所需的正则表达式非常简单。

myfile_.*_[123]\\.mp4

答案 1 :(得分:4)

试试这个: -

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

}

答案 2 :(得分:1)

如果您想使用Pattern执行此操作,这是一个有效的示例,因为您使用的Pattern存在许多问题。

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

输出:

true
true
true

我在您使用的Pattern中找到的问题:

  • 我将^0部分解释为可选的起始字符。 ^字符可以表示整个输入的开头,或者字符或组的否定(仅在字符类中有效)。
  • 必须转义.中的Pattern
  • 不确定%dPattern的含义,因为它不反映您示例中的任何内容。是因为你想要对数字进行分组并对它们进行反向引用?在这种情况下,您可以将数字表达式包装在圆括号周围 - 在这种情况下它将是您的index-1组。

答案 3 :(得分:0)

尝试这样的事情。我觉得这很容易

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

以下将返回您计算机中的所有文件符合您的条件。

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

}