【问题标题】:Regex to validate a filename正则表达式验证文件名
【发布时间】:2012-04-25 21:41:02
【问题描述】:

我需要在这样的方法中验证 a。

    validateFileName(Editable s) {
        String filtered_str = s.toString();
        if (filtered_str.matches(".*[regexp].*")) {
            filtered_str = filtered_str.replaceAll("[regxp]", "");
            s.clear();
            s.append(filtered_str);}

我应该使用哪些正则表达式来排除所有非法字符和空格?我用的是linux

【问题讨论】:

  • 在 Unix 文件系统中,文件名中唯一的非法字符是 /(路径分隔符)和 \0(C 中字符串的结尾)。
  • 您可能还希望将以下内容排除在文件名之外:.~#-

标签: java regex file


【解决方案1】:

如果您使用的是 POSIX 兼容的操作系统,文件名中的合法字符是 a-z、A-Z、0-9、句点、下划线和连字符。因此,匹配“非法”字符的正则表达式将是

[^-_.A-Za-z0-9]

附录:这是如果您想要一个完全可移植的文件名。正如我在下面 Josip 的评论中得到纠正的那样,POSIX 本身实际上允许更多字符。

【讨论】:

  • 这似乎不正确,因为pubs.opengroup.org/onlinepubs/9699919799/basedefs/… 只说“组成名称的字节不应包含 字符。”在第 3.170 节文件名中。
  • 啊,是的。我应该在我的回答中澄清,如果你想要一个 完全可移植的 文件名,你会使用我描述的正则表达式。这来自 Donald Lewine (1991) 所著的 POSIX 程序员指南:编写可移植的 UNIX 程序 一书,第 63-64 页。
  • 这仍然是非常严格的,这在 1991 年是可以理解的,但现在并非如此,例如文件名中的逗号和空格在用户中非常常见。如果你应用它,他们可能会抱怨,而坚持 80 年代的限制不一定被认为是合理的理由。
【解决方案2】:

如果您的想法只是排除非法字符和空格字符,您可以使用以下内容:

'^[^*&%\s]+$'

您可以在其中将任何“非法”字符添加到字符列表中(在这种情况下,它会忽略 *、&、% 和空格)\s 是空格! [] 内的 ^ 是正则表达式语法的一部分,它的意思是:not 匹配 [] 内的任何字符。

【讨论】: