一、情景
最近需要验证一个给定的文件路径是否合法。首先这里指的是路径名称合法,但不是说路径存在或者可以创建,因为这个路径是其他机器上的文件路径,不能通过是否存在或者创建是否成功来判断是否合法。
二、解决方案
因而决定使用正则表达式试试,表达式如下:
^(?<path>(?:[a-zA-Z]:)?\\(?:[^\\\?\/\*\|<>:"]+\\)+)(?<filename>(?<name>[^\\\?\/\*\|<>:"]+?)\.(?<ext>[^.\\\?\/\*\|<>:"]+))$
下面解析下这个表达式
^ #匹配字符串的开始 (?<path> #文件路径分组,指定分组名为path (?:[a-zA-Z]:)?\\ #匹配盘符,如"C:\"、"e:\"、"\" (?:[^\\\?\/\*\|<>:"]+\\)+ #匹配文件夹名称部分,如"folder1\"、"folder1\folder2\" ) #文件路径分组结束 (?<filename> #文件名分组,指定分组名为filename (?<name> #文件名分组,指定分组名为name [^\\\?\/\*\|<>:"]+?) #匹配文件名称,不包含字符'\'、'?'、'/'、'|'、'<'、'>'、':'、'"' \. #匹配字符'.' (?<ext>[^.\\\?\/\*\|<>:"]+) #匹配文件后缀名 ) $ #匹配字符串的结束
三、测试方法
使用RegexTester测试一下
输入c:\windows\system32\mfc.dll
输入非法的路径,匹配失败
c:\windows\sys<\mfc.dll
当然该正则表达式还有问题。
如果输入路径c:\windows\\system32\mfc.dll,路径匹配也会失败,所以在用表达式检测前需要把路径中的'\\'替换成'\'
不能匹配网络路径,如\\server\sharefolder\file1.txt
四、相关引用
一些比较好的文章
看了一下正则表达式,这个教程不错《正则表达式30分钟入门教程》
regexlab上的文章《揭开正则表达式的神秘面纱》
MSDN中也有正则表达式的文章