用正则验证文件名是否合法

 我以前都是用 File 类的 createNewFile() 方法.当然,这个方法的确很管用.但当要批量验证时,总不能一个个创建文件吧.

于是想到了正则, 正则匹配的开销比创建文件小了不知道多少倍.
Google了一下Win平台的文件名规则,并实践了一下.


那么一个合法的文件(Win下)应该符合如下规则 .

  1. 文件名不能为空,空在这里有两个意思
    • 文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等不可见的转义字符)
    • 文件名和扩展名不能同时为空.但实际上我们可以用程序创建出类似.project,..txt等形式的文件,但却创建不出类似abc.的文件
  2. 文件名中不能包含\/:*?”<>|中的任意字符
  3. 文件名(包括扩展名)的长度不得大于255个字符

事实上形如”..”(不包含引号,下同)的文件也不能被创建.
不合法的文件还有类似” aa”, “aa “, “aa.”(会被创建为”aa”,也把它算作不合法),”a\ta”(\t为制表符等不可见字符(除空格外))

于是我们得到了文件名命名规则的更详细规定:

  1. 首尾不能有空字符(空格、制表符、换页符等空白字符的其中任意一个),文件名尾不能为.号
  2. 文件名和扩展名不能同时为空
  3. 文件名中不能包含\/:*?”<>|中的任意字符
  4. 文件名(包括扩展名)的长度不得大于255个字符
  5. 在1.的条件下,文件名中不能出出现除空格符外的任意空字符.出现控制字符其实也算不合法,但因为情况太复杂,就不做判断了。

于是有如下匹配

首字符: [^\s\\/:\*\?\"<>\|]
尾字符: [^\s\\/:\*\?\"<>\|\.]
其它字符: (\x20|[^\s\\/:\*\?\"<>\|])*

\s 只能匹配下面六种字符(via: java.util.regex.Pattern):

半角空格( )
水平制表符(\t)
竖直制表符
回车(\r)
换行(\n)
换页符(\f)

用Java语言实现:

public static boolean isValidFileName(String fileName) { 
    if (fileName == null || fileName.length() > 255) 
        return false; 
    else 
        return fileName.matches( 
           "[^\\s\\\\/:\\*\\?\\\"<>\\|](\\x20|[^\\s\\\\/:\\*\\?\\\"<>\\|])*[^\\s\\\\/:\\*\\?\\\"<>\\|\\.]$"); 
}

用于测试:

System.out.println("null(未初始化)" + "\t" + isValidFileName(null)); 
System.out.println(" .xml" + "\t" + isValidFileName(" .xml")); 
System.out.println(".xml " + "\t" + isValidFileName(".xml ")); 
System.out.println(" .xml " + "\t" + isValidFileName(" .xml ")); 
System.out.println(".xml." + "\t" + isValidFileName(".xml.")); 
System.out.println(".xml" + "\t" + isValidFileName(".xml")); 
System.out.println("    .xml(制表符)" + "\t" + isValidFileName("    .xml")); 
System.out.println(".." + "\t" + isValidFileName("..")); 
System.out.println("fdsa    fdsa(制表符)" + "\t" + isValidFileName("fdsa    fdsa(制表符)")); 
System.out.println("a.txt" + "\t" + isValidFileName("a.txt"));

结果:

null(未初始化)      false 
 .xml   false 
.xml    false 
 .xml   false 
.xml.   false 
.xml    true 
    .xml(制表符)   false 
..      false 
fdsa    fdsa(制表符)       true 
a.txt   true

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在大多数操作系统中,文件名合法需要满足以下规则: 1. 仅包含字母、数字、下划线和连字符(即横线或减号); 2. 不能以点号开头; 3. 不能包含特殊字符,如空格、斜杠、反斜杠、冒号、星号等; 4. 文件名长度不能超过操作系统所允许的最大长度。 因此,可以使用以下正则表达式来匹配合法文件名: ``` ^[a-zA-Z0-9_-]+(?:\.[a-zA-Z0-9]+)?$ ``` 解释一下这个正则表达式: - `^` 表示匹配字符串的开头; - `[a-zA-Z0-9_-]+` 表示匹配至少一个字母、数字、下划线或连字符; - `(?:\.[a-zA-Z0-9]+)?` 表示可选的文件扩展名,即一个点号后面跟着至少一个字母或数字; - `$` 表示匹配字符串的结尾。 使用这个正则表达式可以有效地判断一个字符串是否合法文件名。 ### 回答2: 正则表达式可以用来验证文件名合法性。一个合法文件名通常包含字母、数字、下划线和连字符,并且长度可能有限制。根据具体需求,正则表达式可以灵活地匹配不同的文件名形式。 以下是一个示例的正则表达式来验证文件名合法性: ^[a-zA-Z0-9_-]{1,30}\.\w+$ 解释: - ^ 表示字符串的起始位置 - [a-zA-Z0-9_-] 表示允许的字符范围为字母(大小写)、数字、下划线和连字符 - {1,30} 表示限制文件名的长度为 1 到 30 个字符 - \. 表示一个点,用来分隔文件名扩展名 - \w+ 表示允许的扩展名为一个或多个字母、数字或下划线字符 - $ 表示字符串的结束位置 根据上述正则表达式,以下是一些合法文件名示例: - myfile.txt - file-123.jpg - document_2021.pdf 而以下是一些不合法文件名示例: - file*name.txt (包含非法字符 *) - .hiddenfile (文件名不能为空) - verylongfilename1234567891011121314151617181920.docx (超过长度限制) 我们可以通过使用正则表达式,使用编程语言中的相关函数进行文件名验证。这样可以保证文件名合法性,确保代码的可靠性和安全性。 ### 回答3: 正则表达式可以用来判断文件名是否合法文件名合法性通常要满足以下条件:不包含非法字符,长度不超过一定限制,与系统保留字无冲突,并且符合特定的命名约定。 首先,文件名不能包含非法字符。在Windows系统中,文件名中不能包含下列字符之一:\ / : * ? " < > |。在Unix/Linux系统中,文件名中不能包含 / 或者 NUL 字符(ASCII 0)。可以使用正则表达式来排除这些非法字符,例如可以使用 [\w\s\-\.] 来表示合法字符,其中 \w 表示任何字母、数字、下划线,\s 表示空格,\- 表示减号,\. 表示点号。 其次,文件名的长度一般是有限制的。不同操作系统对文件名的长度限制不同。Windows 系统中,文件名长度通常不超过255个字符。使用正则表达式可以通过 \{0,255\} 来表示文件名长度不超过255个字符。 然后,文件名不能与系统保留字冲突。不同操作系统有不同的保留字列表,文件名不能与这些保留字相同或相似。例如在Windows系统中,文件名不能与以下保留字相同:CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9. 使用正则表达式可以通过 [(?!CON|PRN|AUX|NUL|COM\d|LPT\d|\.\w{3})\w]+ 来排除这些保留字。 最后,文件名还需要符合特定的命名约定,例如只能包含字母、数字、下划线等字符,或者需要以特定的前缀或后缀开头或结尾等。使用正则表达式可以根据具体的命名约定来判断文件名合法性。 综上所述,正则表达式可以很好地判断文件名合法性,通过排除非法字符、限制长度、避免与系统保留字冲突,并符合特定的命名约定,来确定是否一个文件名合法的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值