当前位置:网站首页>用正则验证文件名是否合法
用正则验证文件名是否合法
2022-08-11 05:23:00 【丶随心】
File
类的 createNewFile()
方法.当然,这个方法的确很管用.但当要批量验证时,总不能一个个创建文件吧. 于是想到了正则, 正则匹配的开销比创建文件小了不知道多少倍.
Google了一下Win平台的文件名规则,并实践了一下.
那么一个合法的文件(Win下)应该符合如下规则 .
- 文件名不能为空,空在这里有两个意思
- 文件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等不可见的转义字符)
- 文件名和扩展名不能同时为空.但实际上我们可以用程序创建出类似.project,..txt等形式的文件,但却创建不出类似abc.的文件
- 文件名中不能包含\/:*?”<>|中的任意字符
- 文件名(包括扩展名)的长度不得大于255个字符
事实上形如”..”(不包含引号,下同)的文件也不能被创建.
不合法的文件还有类似” aa”, “aa “, “aa.”(会被创建为”aa”,也把它算作不合法),”a\ta”(\t为制表符等不可见字符(除空格外))
于是我们得到了文件名命名规则的更详细规定:
- 首尾不能有空字符(空格、制表符、换页符等空白字符的其中任意一个),文件名尾不能为.号
- 文件名和扩展名不能同时为空
- 文件名中不能包含\/:*?”<>|中的任意字符
- 文件名(包括扩展名)的长度不得大于255个字符
- 在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
边栏推荐
猜你喜欢
随机推荐
mysql基本概念之索引
NodeRed系列—创建mqtt broker(mqtt服务器),并使用mqttx进行消息发送验证
GBase 8a 并行技术
php反序列化pop链
azkaban集群部署
GBase 8s的多线程结构
RIP综合实验
sand和mana两大元宇宙游戏,哪个更有潜力?
云计算学习笔记——第一章 云计算介绍
GBase 8s存储结构简介及空间管理
Dos命令
动画(其二)
MGRE环境下的OSPF综合实验
NodeRed系列—nodered安装及基本操作
OSPF综合实验
【转载】图表:数读2022年上半年国民经济
显示桌面该有的图标设置
RecycleView
【OAuth2】授权机制
配置@路径简化路径处理