1

当用户将目录名称传递给我的程序时,我会检查它

private static final Pattern    DIRECTORY_PATTERN   
            = Pattern.compile("/*?([a-zA-Z_0-9]+)/*?",
                    Pattern.CASE_INSENSITIVE);

到目前为止我们所看到的,这是可行的,但我怀疑这个正则表达式是不完整的。

你知道,或者你能建议一个更完整的正则表达式来验证目录名称吗?

4

2 回答 2

3

实际上,您可以在文件名中使用更多字符,甚至是退格和换行符等令人发指的字符。实际上,您可能会发现它依赖于底层文件系统。我隐约记得某处的规则允许除实际路径分隔符之外的所有内容。

在决定某件事是否有效时,我总是考虑的一件事是使用它。例如,您可以使用(复杂)正则表达式验证电子邮件地址的格式,但确定它完全有效的唯一方法是向其发送超链接邮件以验证它是否已收到。

在您的特定情况下,如果您想创建一个具有该名称的文件,您可以尝试在您实际允许在其中创建文件的目录中创建一个临时文件。如果文件创建成功,您可以确定这是一个有效的名称 :-) 当然,如果您正在创建一个文件,您可能只想创建真正的文件。如果您正在打开现有文件,请忘记正则表达式,只需尝试打开文件 -正则表达式中的任何复杂性都不会告诉您该文件是否存在或您是否可以读取。

不过,坦率地说,我会考虑对允许的字符设置您自己的限制 - 过去,我曾诅咒那些愚蠢到在其中创建包含 CTRL 字符的文件名的人,或者有人称-rfrm命令有问题with(直到你弄清楚如何解决这个问题)。

于 2012-07-10T16:21:34.917 回答
0

这是特定于文件系统的。查看您希望使用的 FS 的文档以获取可接受的符号列表和目录名称限制。对于几乎所有存在的现代 FS,您已经遗漏了许多标点符号和数千个非拉丁符号。

于 2012-07-10T16:18:04.423 回答