我使用以下代码自动重命名文件:
public static String getNewNameForCopyFile(final String originalName, final boolean firstCall) {
if (firstCall) {
final Pattern p = Pattern.compile("(.*?)(\..*)?");
final Matcher m = p.matcher(originalName);
if (m.matches()) { //group 1 is the name, group 2 is the extension
String name = m.group(1);
String extension = m.group(2);
if (extension == null) {
extension = "";
}
return name + "-Copy1" + extension;
} else {
throw new IllegalArgumentException();
}
} else {
final Pattern p = Pattern.compile("(.*?)(-Copy(\d+))?(\..*)?");
final Matcher m = p.matcher(originalName);
if (m.matches()) { //group 1 is the prefix, group 2 is the number, group 3 is the suffix
String prefix = m.group(1);
String numberMatch = m.group(3);
String suffix = m.group(4);
return prefix + "-Copy" + (numberMatch == null ? 1 : (Integer.parseInt(numberMatch) + 1)) + (suffix == null ? "" : suffix);
} else {
throw new IllegalArgumentException();
}
}
}
这主要只适用于以下文件名。我遇到了问题,不知道如何调整我的代码:test.abc.txt重命名后的文件变为"test-Copy1.abc.txt",但应为"test.abc-Copy1.txt"。
你知道我怎样才能用我的方法做到这一点吗?
如果我理解正确,您希望在文件名的最后一个点('.'
)之前插入一个副本编号(如果有的话),而不是在第一个点之前插入。这是因为您对第一组使用了不情愿的量词,而第二组能够匹配包含任意数量点的文件名尾部。我认为你会做得更好:
final Pattern p = Pattern.compile("(.*?)(\.[^.]*)?");
请注意,如果存在,则第二组以一个点开始,但不能包含其他点。
我想你要做的是找到最后一个"。"用名字,对吗?在这种情况下,你需要使用贪婪匹配.*(尽可能多地匹配)而不是.*?
final Pattern p = Pattern.compile("(.*)(\..*)")
您需要单独处理无点的情况:
if (originalName.indexOf('.') == -1)
return originalName + "-Copy1"
Your other code