Java正则匹配Windows文件目录(详解)

深夜博客(>v0)

最近实验课要用Java写Socket编程,做一个文件服务器类似FTP那样的,使用命令行来ls、cd、get文件,途中遇到一个问题,就是如何用正则匹配Windows文件目录,比如D:\CSDN\我的博客这样的字符串,在网上翻了好长时间想找找有没有现成的,结果都是不是很全面的表达式,算了还是自己写正则表达式吧,于是自己写了一个感觉是很全面的一个表达式了,供大家参考,有问题可以评论区评论,我在做修改


此正则表达式只适用于Java中使用,且只适用于匹配Windows的绝对文件路径,若想复用,可以看看思路,删掉一些鸡肋的地方

我这里用的是String的matches方法来做的正则匹配,String的这个方法很鸡肋,只能判断字符串是否符合正则表达式,而且有一些很无语的bug

先给出我的代码段,在做讲解:

String text = "D:\\CSDN\\我的博客";
String fileRegex = "^[A-z]:\\\\([^|><?*\":\\/]*\\\\)*([^|><?*\":\\/]*)?$";
System.out.println(text.matches(fileRegex));

这里的正则表达式就是这个^[A-z]:\\\\([^|><?*\":\\/]*\\\\)*([^|><?*\":\\/]*)?$,看着是有些复杂,其实很简单

首先,D:\\CSDN\\我的博客之所以是\\,是因为这里要转义,否则你的eclipse会语法报错;
然后我们来看这个表达式,我们把它分为三部分看会比较清晰:
1 ^[A-z]:\\\\ 、 2 ([^|><?*\":\\/]*\\\\)* 、3 ([^|><?*\":\\/]*)?$

  • 第一段 就是匹配绝对路径最前面的盘符名称,比如D:\,你可能会奇怪了,为什么这里不是一个\而是三个,这就是我觉得这个方法bug的地方,正常来说,正则表达式确实只用写一个\就可以了,但是这里在需要三个\来做转义,这还有别于2中[pattern]中的转义
  • 第二段 匹配的是D:\之后的路径地址,比如CSDN\,这里正则的意思是 : 匹配除了 |><?*":\/ 这些Windows文件不允许出现的字符外的所有字符加上\的零次或多次 ,所以这里就包含了中英文和其他常见字符 ,相当于做了排除法;需要特别提醒的是,这里的[]里的\只需要一个\就可以转义
  • 第三段 是做了一个特殊处理,什么特殊处理呢?就是当有一种情况,如果不写第三段就会出现问题,比如D:\CSDN\我的博客,第二段只能匹配到 文件夹+\ ,最后的文件夹如果不带\,则无法匹配;为了处理这种情况,我们写了第三段;第三段意思是匹配以仅以一个文件夹名结尾的字符串零次或一次;若最后有\,则前两个匹配生效;若没有最后的\则在前两个基础上,第三个也生效了
发布了65 篇原创文章 · 获赞 58 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/AngelLover2017/article/details/84147705