java - 删除所有非字母数字、单句点和单斜杠的正则表达式

标签 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”

如有任何帮助,我们将不胜感激。

最佳答案

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

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/\

关于java - 删除所有非字母数字、单句点和单斜杠的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41002747/

相关文章:

java - 一个类不会导入到另一个类中如何解决这个问题?

java - 循环队列中的 isEmpty() 没有计数方法/

Python 的正则表达式 findall 不返回 Unicode 文本的所有匹配项

Python : How to parse things such as : from, 到正文,来自带有 Python 的原始电子邮件源

regex - Vim - 如何使用匹配模式连接行

java - 用于计数数组反转的合并排序实现

java - 绘图 : centering objects of different size

java - 使用 SimpleDateFormat 在 Java 中格式化 JavaScript jQuery 日期格式

java - 如何替换特定单词后面出现的单词?

java - 以 "?"作为 clown 的字符串搜索?