我有一个类,可以替换字符串可能包含的非法字符,以允许将它们用作文件名。问题是它用“_”替换任何非法字符,只要字符串不完全由非法字符组成就可以。
例如 cleanFilename(">>>")
将返回与 cleanFilename("***")
返回的相同字符串。因此,在存储 ">>>"
之后将 "***"
存储在文件中,将替换第一个文件。
public class StringCleaner {
public static String cleanFilename(String dirtyString) {
return dirtyString.replaceAll("[:\\/*?|<> ]", "_");
}
public static String cleanDirectory(String dirtyDirectory) {
return dirtyDirectory.replaceAll("[:\\*?|<> ]", "_");
}
}
我可以改变什么来避免这个问题?
抱歉这个尴尬的标题我找不到更好的标题。
更新:我希望它创建可读的文件名,以便仅通过读取文件名即可进行识别。
谢谢
塞利姆
最佳答案
因此,您正在寻找一种可逆且可重复的机制来替换文件名中的有趣字符。执行此操作的典型方法是创建转义序列。例如,请考虑以下情况:
选择一个字符用作转义序列。该字符必须是文件名中的合法字符,但不常用,我们将其用作转义序列。
让我们选择 +
字符。然后,我们用唯一标识被替换字符的字符序列替换所有非法字符。
例如,替换文件“this has a space”中的空格(字符 32)将得到结果“this+32+has+32+a+32+space”....
public class StringCleaner {
public static void main(String[] args) {
StringCleaner sc = new StringCleaner();
System.out.println(sc.cleanFilename("this has a space"));
System.out.println(sc.cleanFilename("this has a plus +"));
System.out.println(sc.cleanFilename("this is full :\\/*?|<> + of stuff"));
}
private static final Pattern illegalfilechars = Pattern.compile("[:\\/*?|<> +]");
private static final Pattern illegaldirchars = Pattern.compile("[:\\*?|<> +]");
private static final String replaceall(Pattern pattern, String dirtyString) {
Matcher mat = pattern.matcher(dirtyString);
if (!mat.find()) {
return dirtyString;
}
StringBuffer sb = new StringBuffer();
do {
mat.appendReplacement(sb, "+" + (int)mat.group(0).charAt(0) + "+");
} while (mat.find());
mat.appendTail(sb);
return sb.toString();
}
public static String cleanFilename(String dirtyString) {
return replaceall(illegalfilechars, dirtyString);
}
public static String cleanDirectory(String dirtyDirectory) {
return replaceall(illegaldirchars, dirtyDirectory);
}
}
当我运行代码时,我得到结果:
this+32+has+32+a+32+space
this+32+has+32+a+32+plus+32++43+
this+32+is+32+full+32++58+\+47++42++63++124++60++62++32++43++32+of+32+stuff
这也表明字符“\”的模式是错误的
关于java - 避免使用正则表达式覆盖文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19399148/