正则表达式删除所有非字母数字,单个句点和单斜杠

时间:2016-12-06 18:54:08

标签: java regex

我试图将字符列入白名单以防止文件名并阻止路径操作。我们从前端返回一个文件名(我知道。)并解析它以确定它是否在指定的文件夹中。因此,我们需要确保用户没有传入可能从指定文件夹中逃脱的文件。这意味着我们的有效文件名是:

  • 字母数字
  • 可以包含任意方向的单斜杠
  • 可以包括单个点但不包括对。

所以" APP-TEST-file.20161115.1"是有效但是" /../../ test // \"在检查文件系统之前需要删除一些字符。

这是我现在拥有的正则表达式,不幸的是它已经删除了太多。

public static String validateFilePath(String fileName) {
    return fileName.replaceAll("[^A-Za-z0-9]+[(\\.\\/)\\+2]", "");
}

这样" APP-TEST-file.20161115.1"正在变成" APP-TEST-file0161115.1"

任何帮助都会得到满足。

1 个答案:

答案 0 :(得分:2)

你想要这样的东西吗? (我不清楚你想要什么!)

String filename = "APP-TEST-file.20161115.1";
// replace two consecutive dots with a single dot
filename = filename.replaceAll("\\.+", ".");
// replace two consecutive forward slash with a single forward slash
filename = filename.replaceAll("/+", "/");
// replace two consecutive baskslash with a backslash
filename = filename.replaceAll("\\\\+", "\\\\");
// allow alphanumeric characters, dots and both type of slashes
filename = filename.replaceAll("[^A-Za-z0-9./\\\\]+", "");
System.out.println(filename);

打印:

APPTESTfile.20161115.1

如果filename="/../../test//\\",则打印 - /././test/\