我正在使用以下代码自动重命名文件:
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'。
你知道如何用我的方法实现这个目标吗?
答案 0 :(得分:0)
我认为你要做的就是找到最后一个'。'在名字中,对吗?在那种情况下,你需要使用贪心匹配。*(尽可能匹配)而不是。*?
final Pattern p = Pattern.compile("(.*)(\\..*)")
你需要单独处理没有点的情况:
if (originalName.indexOf('.') == -1)
return originalName + "-Copy1"
Your other code
答案 1 :(得分:0)
如果我理解正确,您希望在文件名中的最后一个点('.'
)之前插入一个副本号(如果有),而是在第一个点之前插入。之所以出现这种情况,是因为您对第一组使用了不情愿的量词,而第二组能够匹配包含任意数量点的文件名尾部。我想你会做得更好:
final Pattern p = Pattern.compile("(.*?)(\\.[^.]*)?");
请注意,如果它存在,则第二组以点开头,但不能包含其他点。