java⽤正则⽅法验证⽂件名是否合法
中⽤到⽂件操作时,经常要验证⽂件名是否合法. ⽤File类的createNewFile()⽅法的确很管⽤.但当要批量验证时,效率上就会有问题.正则匹配的开销⽐创建⽂件少了很多. 那么⼀个合法的⽂件(Win下)应该符合如下规则:
1.⽂件名不能为空,空在这⾥有两个意思:
1. ⽂件名(包括扩展名)长度为0或仅由空字符组成(包括\t\b等不可见的转义字符)
2. ⽂件名和扩展名不能同时为空.但实际上我们可以⽤程序创建出类似.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: 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\\\\/:\\*\\?\\\"<>\\|\\.]$"); }
正则匹配空字符
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论