【问题标题】:Cleaning a file name in Java在 Java 中清理文件名
【发布时间】:2015-07-07 19:24:38
【问题描述】:

我想编写一个脚本来清理我的 .mp3 文件。 我可以写几行来更改名称,但我想编写一个自动脚本,该脚本将删除所有不需要的字符$%_!?7 等,同时将名称更改为下一种格式Artist space dash Song

    File file = new File("C://Users//nikita//Desktop//$%#Artis8t_-_35&Son5g.mp3");
    String Original = file.toString();
    String New = "Code to change 'Original' to 'Artist - Song'";
    File file2 = new File("C://Users//nikita//Desktop//" + New + ".mp3");
    file.renameTo(file2);

我觉得我应该列出所有可能的字符,然后在这个列表中运行字符串并删除所有列出的字符,但我不知道该怎么做。

String test = "$%$#Arti56st_-_54^So65ng.mp3";

编辑 1:

当我尝试使用 remove 方法时,它仍然没有更改名称。

String test = "$%$#Arti56st_-_54^So65ng.mp3";
System.out.println("Original: " + test);
test.replace( "[0-9]%#&\\$", "");
System.out.println("New:      " + test);

上面的代码返回如下输出

Original: $%$#Arti56st_-_54^So65ng.mp3
New:      $%$#Arti56st_-_54^So65ng.mp3

【问题讨论】:

  • 是的,完全正确。字符串本质上只是一个字符数组。有一个包含不需要字符集合的列表或另一个数组,遍历字符串,检查索引处的字符是否在不需要的字符列表中,然后删除。正则表达式也可以。
  • 可能没有s.replace( "[0-9]%#&\\$", "")那么简单——“离家2000光年”呢?还是“10cc”?
  • 这就是重点。看看 OP 的例子 - 摆脱数字似乎是目标之一。
  • 离开爱人的 50 种方法 - Paul Simon。 66 号公路——滚石乐队。在 2525 年 - 扎格和埃文斯。 10.000 名男子 - 鲍勃·迪伦。我的大脑下 50,000 英里 - 十年后
  • @laune 即使我做了你没有建议的解决方案,它仍然不起作用。我编辑了问题。

标签: java string mp3 filenames file-rename


【解决方案1】:

我会建议这样的事情:

public static String santizeFilename(String original){
    Pattern p = Pattern.compile("(.*)-(.*)\\.mp3");
    Matcher m = p.matcher(original);

    if (m.matches()){
        String artist = m.group(1).replaceAll("[^a-zA-Z ]", "");
        String song = m.group(2).replaceAll("[^a-zA-Z ]", "");

        return String.format("%s - %s", artist, song);
    }
    else {
        throw new IllegalArgumentException("Failed to match filename : "+original);
    }

}

(编辑 - 更改了白名单正则表达式以排除数字和下划线)

特别是两点 - 在清理字符串时,最好将允许的字符列入白名单,而不是将要排除的字符列入黑名单,这样你以后就不会对边缘情况感到惊讶。 (您可能想要一个比我在这里使用的限制更少的白名单,但很容易改变) 处理文件名与预期模式不匹配的情况也是一个好主意。如果您的代码遇到 MP3 以外的其他内容,您希望它如何响应?在这里,我遇到了一个异常,因此调用代码可以适当地捕获和处理它。

【讨论】:

  • 特伦斯·特伦特·达比会怎么样?
  • 它对除_ 和数字之外的字符非常有效。我收到的输出是Arti56st_-_54So65ng。我尝试添加 _ 和数字,但没有成功。
  • @laune Terence Trent D'Arby 会没事的,因为无论如何我都打算摆脱所有 '
  • 正如我所说,您可以将不希望被删除的额外字符添加到白名单中。就我个人而言,为了安全起见,我更愿意删除撇号,但如果你喜欢危险地生活,那取决于你!
  • 但是你不能去掉数字——这会损坏一些标题。除非你以后修补它。
【解决方案2】:
String new = original.replace( "[0-9]%#&\\$", "")

这应该替换几乎所有你不想要的字符

或者你可以想出自己的正则表达式

https://docs.oracle.com/javase/tutorial/essential/regex/

【讨论】:

  • 试试这样的? "/[^0-9,.]/"
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2012-04-29
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多