避免使用正则表达式覆盖文件

时间:2013-10-16 09:01:41

标签: java regex filenames

我有一个类替换字符串可能包含的非法字符,以允许将它们用作文件名。问题是它用“_”替换任何非法字符,只要字符串不完全由非法字符组成,就可以了。 例如,cleanFilename(">>>")将返回相同的字符串cleanFilename("***")返回。因此,在存储"***"之后将">>>"存储在文件中将替换第一个文件。

public class StringCleaner {

    public static String cleanFilename(String dirtyString) {
        return dirtyString.replaceAll("[:\\/*?|<> ]", "_");
    }

    public static String cleanDirectory(String dirtyDirectory) {
        return dirtyDirectory.replaceAll("[:\\*?|<> ]", "_");
    }
}

为了避免这个问题,我可以改变什么? 对不起,我找不到更好的标题。

更新:我希望它能够创建可读的文件名,以便只通过读取文件名进行识别。

由于
塞利姆

1 个答案:

答案 0 :(得分:1)

因此,您正在寻找一种可逆且可重复的机制来替换文件名中的有趣字符。执行此操作的典型方法是创建转义序列。例如,请考虑以下事项:

选择一个字符作为转义序列。此字符必须是文件名中的合法字符,但不常用,我们将其用作转义序列。

让我们选择+个字符。然后,我们用一系列唯一标识替换字符的字符替换所有非法字符。

例如,替换文件“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

也表示字符'\'

的模式错误