深夜博客(>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\我的博客
,第二段只能匹配到文件夹+\
,最后的文件夹如果不带\
,则无法匹配;为了处理这种情况,我们写了第三段;第三段意思是匹配以仅以一个文件夹名结尾的字符串零次或一次;若最后有\
,则前两个匹配生效;若没有最后的\
则在前两个基础上,第三个也生效了