正则表达式获取文件路径和名称

开发工具与关键技术:RegexBuddy
作者:熊俊杰

在接触了mvc后我们通常都会遇到一些项目需要上传文件或者图片和把文件或图片返回到页面去,上传文件和图片我们只需要在控制器里面给他们创建好路径就可以把我们想要的文件保存到数据库里面,但是我们要把保存到数据库里面的文件获取出来并且返回到页面上去就需要通过正则表达式才可以实现。

我们上传到数据库文件基本都是以标签的形式显示的如下:

适合文件路径的正则表达式java 正则表达式文件名_正则表达式


所以,我们从数据库里面得到的数据基本都是一串标签,但是我们想要得到的并不是一串标签而是文件的路径,例如这样:/Document/201701051717269020902.mp4;如果我们不用正则表达式的话就需要把标签通过“ ” ”来分割然后通过数组的方法来获取想要的路径,但是也有的文件存储的方法不同例如:

< a href="/ SystemManagement /IssuanceNotice/DownloadAttachment?fileName=~5JGNUBE@Z0 1(N{R0]T3YEW2019-03-31-19-47-30-6697.gif" target="_blank"> ~5JGNUBE@Z01(N{R0]T3YEW.gif

这样的话每次获取数据都要去判断文件的存储方式再去获取路径,那么这就会大大增加我们的代码量也会大大降低我们的速度。即使获取到了文件路径我们还是需要用正则表达式,因为文件名称不用正则表达式是无法获取到的,例如:

~5JGNUBE@Z0 1(N{R0]T3YEW2019-03-31-19-47-30-6697.gif

每个文件的名称都不相同后缀名也不相同,所以只有通过正则表达式来获取。

下面我就用我所知道的方法来解决这个问题,“/.+?(?=")”或者“/(?<=="/).+?(?=")”都可以把我们想要的路径获取到,如下:

适合文件路径的正则表达式java 正则表达式文件名_正则表达式_02


适合文件路径的正则表达式java 正则表达式文件名_文件名_03


第一种方法是直接获取到“/”再“.+”代表匹配出换行符以外的任意字符,且重复一次或更多次。“?”代表懒惰匹配,“(?=")”使用了零宽先行断言,它匹配文本中的某些位置,这些位置的后面能匹配给定的后缀“ ” ”。第二种方法是直接用零宽后行断言再零宽先行断言最后把要匹配的“/”加到最前面就可以了。

获取文件名称,首先要知道文件是创建在哪里,然后用零宽后行断言再零宽先行断言匹配出文件名称“(?<=/Document/Notice/NoticeCarousel/).+?(?=")”,因为我是在“/Document/Notice/NoticeCarousel/”这个路径下面创建文件的,所以我用后行断言这个路径,从而得到文件名称。

适合文件路径的正则表达式java 正则表达式文件名_适合文件路径的正则表达式java_04


最后在告诉一个小知识“[\u4e00-\u9fa5]”用于匹配所用的汉字但是不包括符号。