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

标签 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("[:\\*?|<> ]", "_");
    }
}

我可以改变什么来避免这个问题?
抱歉这个尴尬的标题我找不到更好的标题。

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

谢谢
塞利姆

最佳答案

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

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

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

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

相关文章:

c# - 逗号分隔字符串的正则表达式匹配

windows - 仅在命令行中列出具有路径和文件大小的文件

windows - 将 GNUMake 与包含空格的文件名一起使用的最可靠方法是什么?

java - HTTP 状态 404 - 在 dockerized payara 中部署 Spring 应用程序 war 时未在页面中找到

java - 如何 Ping 返回类型为 void 的 Web 服务方法

java - 单击 JDialog 中的“取消”按钮时出现异常

c# - 如何从任意字符串生成有效的 Windows 文件名?

java - 生成一个大于或小于前一个随机数的随机数

c++ - 运行正则表达式时未经检查的异常 - 从文件路径获取没有扩展名的文件名

python - 如何删除或替换由起点和终点确定的 Python 中的子字符串?