【问题标题】:Android find a file with a pattern (regex)Android查找带有模式的文件(正则表达式)
【发布时间】:2013-08-12 05:30:16
【问题描述】:

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

  • 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”,类似这样)。

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

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

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

【问题讨论】:

  • 请发布您的 myDirectory 路径
  • 嗨 Yogesh,请看我的编辑。我只是将文件放在 sd 卡中,没有任何子文件夹只是为了测试。谢谢

标签: java android regex filefilter


【解决方案1】:

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

myfile_.*_[123]\\.mp4

【讨论】:

  • 感谢您的直截了当的回答..正是我所需要的:)
  • @junmats 很高兴为您提供帮助。
【解决方案2】:

试试这个:-

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

}

【讨论】:

  • 你的答案和ravi的答案是一样的,但我想我必须把它给他,因为他先回答了。 +1 表示感谢。谢谢!
【解决方案3】:

如果您想使用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 组。

【讨论】:

    【解决方案4】:

    尝试这样的事情。我觉得很简单

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

    【讨论】:

    • 是的,我可以这样做,但从长远来看,文件可能超过一百个,我认为循环遍历整个文件来查找我的文件并不好。但我非常考虑你的回答。谢谢
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2015-03-23
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多