清理 Java 中的文件名
Cleaning a file name in Java
我想编写一个脚本来清理我的 .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);
上面的代码returns下面的输出
Original: $%$#Arti56st_-_54^So65ng.mp3
New: $%$#Arti56st_-_54^So65ng.mp3
String new = original.replace( "[0-9]%#&\$", "")
这应该会替换几乎所有您不想要的字符
或者您可以想出自己的正则表达式
我建议这样:
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 以外的内容,您希望它如何响应?在这里,我遇到了一个异常,因此调用代码可以适当地捕获和处理它。
我想编写一个脚本来清理我的 .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);
上面的代码returns下面的输出
Original: $%$#Arti56st_-_54^So65ng.mp3
New: $%$#Arti56st_-_54^So65ng.mp3
String new = original.replace( "[0-9]%#&\$", "")
这应该会替换几乎所有您不想要的字符
或者您可以想出自己的正则表达式
我建议这样:
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 以外的内容,您希望它如何响应?在这里,我遇到了一个异常,因此调用代码可以适当地捕获和处理它。