JAVA 如何正确地使用正则表达式获取文件名及扩展名 | 您所在的位置:网站首页 › java文件的后缀必须使用什么格式 › JAVA 如何正确地使用正则表达式获取文件名及扩展名 |
获取文件名及扩展名的正确姿势
如何正确使用正则表达式基础方法多个扩展名包含路径正则表达式登场解析没有扩展名的情况结合二者扩展结束
如何正确使用正则表达式
正则表达式非常难,至少我本人是这么想的,逻辑性和全局性,各种条件都要考虑进去。 但是一条正则表达式很多时候可以替代几十行甚至几百行代码,而且可以工作得更好。 基础方法谁都会用最笨的方法来获取文件名及扩展名 。 String fullPath = "博主真厉害.txt"; String fileName = fullPath.substring(0, fullPath.indexOf(".")); String extName = fullPath.substring(fullPath.indexOf(".") + 1); System.out.println(fileName); System.out.println(extName);输出结果 博主真厉害 txt 多个扩展名文件结尾有多个扩展名的情况下 String fullPath = "博主真厉害.txt.exe"; String fileName = fullPath.substring(0, fullPath.indexOf(".")); String extName = fullPath.substring(fullPath.indexOf(".") + 1); System.out.println(fileName); System.out.println(extName);输出结果还是 博主真厉害 txt.exe 很明显,结果是错误的。 应该再加一个判断,甚至是循环,找到最后一个.然后就是正确的结果了。 //此处忽略 lastIndexOf() 包含路径假如带有盘符和其他路径,那么 String fullPath = "C:博主真厉害.txt.exe"; String fileName = fullPath.substring(0, fullPath.indexOf(".")); String extName = fullPath.substring(fullPath.indexOf(".") + 1); System.out.println(fileName); System.out.println(extName);C:博主真厉害 txt.exe 还要判断是否有:和 \ 等,我感觉越来越复杂了,像一个傻瓜。 正则表达式登场在写正则表达式的时候,需要先分析一下字符串的构成。 比如 C:Windows\博主真厉害.txt.exe 文件名在最后一个\后面,直到最后一个.前面。 先写一个最简单的 .*\\(.*)\.(.*)这里有一个在线测试正则表达式的网址: https://regex-testdrive.com/en/dotest 测试结果为 C:Windows\博主真厉害.txt.exe group(0) C:Windows\博主真厉害.txt.exe group(1) 博主真厉害.txt group(2) exe 显然,group(1) 和 group(2) 是我们想要的结果。 解析 .*\\(.*)\.(.*) .可以匹配任意字符 *表示前面的字符可以有任意个(0或无穷)\\表示字符\,因为单独存在时有特殊含义,这里不多说了。中间的(.*)表示我要获得()中的内容,这里是文件名。\.转义表示字符.最后一个(.*)表示要获取的扩展名。 没有扩展名的情况并不是所有文件都有扩展名 当你使用上面的正则表达式来匹配 C:Windows\博主真厉害 时,得不到任何结果。 因为它匹配不到.所以就不会得到任何结果。 没有扩展名的时候应该是 .*\\(.*)表示最后一个\后面全是文件名。 测试结果为 #1 C:Windows\博主真厉害 group(0) C:Windows\博主真厉害 group(1) 博主真厉害 结合二者在表达式中|表示或。 .*\\(.*)\.(.*)|.*\\(.*)测试结果 group(0) C:Windows\博主真厉害 group(1) group(2) group(3) 博主真厉害 group(0) C:Windows\博主真厉害.txt group(1) 博主真厉害 group(2) txt group(3) group(0) C:Windows\博主真厉害.txt.exe group(1) 博主真厉害.txt group(2) exe group(3) 扩展在servlet中,获取上传的文件名,可以使用getHeader(“content-disposition”) String value = part.getHeader("content-disposition"); System.out.println(value);得到形如 form-data; name=“fileUpload”; filename=“博主真厉害.txt” 的字符串。 很多时候,似乎只要这样子就足够了,但是我在eclipse中测试时候,得到了这样的结果 C:Windows\博主真厉害.txt 原来在ie中,它会传出完整的路径 这里直接一条表达式解决它: (?m)(?i)(?u)(?:(filename=".*\\)|(filename="))((.*)(?:\.)(.*)|(.*))(?:") // Group // 1:带有盘符路径 // 2:无自盘符路径 // 3:完整的文件名+扩展名(如果) // 4:文件名 // 5:扩展名 没有扩展名时2.3为空 // 6:仅文名 有扩展名时4为空 String fileName = null; String FileExtension = ""; String contentDisposition = part.getHeader("content-disposition"); Pattern pattern = Pattern .compile("(?m)(?i)(?u)(?:(filename=\".*\\\\)|(filename=\"))((.*)(?:\\.)(.*)|(.*))(?:\")"); Matcher matcher = pattern.matcher(contentDisposition); List fileDetai = new ArrayList(); if (matcher.find()) { fileDetai.add(matcher.group(3).toString()); if (null != matcher.group(4)) { fileName = matcher.group(4).toString(); FileExtension = matcher.group(5).toString(); } else { fileName = matcher.group(6).toString(); } fileDetai.add(fileName); fileDetai.add(FileExtension); return fileDetai; } 结束太好用了。 |
CopyRight 2018-2019 实验室设备网 版权所有 |