的 java 中用到文件操作时,经常要验证文件名是否合法.
我以前都是用 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
相关推荐
正则截取文件名,文件后缀,文件父路径,去掉文件后缀 FileNameUtils.getParentPath : 获取父路径 如 C:\A\B\test.txt 返回: C:\A\B\ /home/usr/test.txt 返回 /home/usr/ FileNameUtils.getSuffix : 获取文件后缀...
需要.net环境 正则验证软件正则验证软件正则验证软件正则验证软件正则验证软件正则验证软件正则验证软件正则验证软件。
JavaScript正则表达式验证身份证号码是否合法(两种方法)分析.docx
正则验证大全正则验证大全正则验证大全正则验证大全
PHP使用正则验证数据,邮箱,手机,IP等
需要.net环境 正则验证软件正则验证软件正则验证软件正则验证软件正则验证软件正则验证软件
autoit 正则验证工具 用穷举的方法生成图片 验证正则表达式完备性
批量修改文件名
在用户注册页面有些需求要求的比较严格,需要对身份证验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客。此篇文章主要是讲解如何用javascript正则表达式验证身份证号码是否合法,需要的朋友可以参考下
自定义文本框控件,能实现自定义的正则验证规则。
常用正则验证,各种常用验证包含,汉字、手机号、电话号码、email、金额、特殊字符等常见完整js类库。
c#使用正则表达式验证电话号码,程序可以很好运行,方便大家学习
JS input输入框 英文 中文 邮箱 手机号 银行卡 身份证等等各种正则验证 确保上传的内容合法合规,涉及侵权内容将会被移除
查找或替换指定目录下的文件名中的某个字符,非常实用
c#使用正则表达式验证身份证号码,工程完全可以运行,方便大家参考和学习
java 使用正则表达式验证电话号码的格式 java 使用正则表达式验证电话号码的格式
正则验证软件 英文版正则验证软件 英文版正则验证软件 英文版
正则表达式正则表达式正则表达式正则表达式 验证程序
利用js和正则 在前端验证邮箱的合法性。请参考。
正则表达式 JS 身份证验证 正则表达式 JS 身份证验证 正则表达式 JS 身份证验证