基于Groovy查找含指定子目录的目标文件路径方案咨询
解决Groovy中精准匹配包含指定子目录的文件路径问题
嘿,我来帮你搞定这个Groovy路径匹配的问题!你需要的是在指定basedir下,找到**必须包含指定子目录SUBDIRNAMEWEKNOW**且文件名为filename.xml的路径,之前的写法返回多余结果是因为匹配范围太宽了,下面给你两种靠谱的解决方案:
方案一:用Ant风格路径模式(推荐,简洁易读)
Groovy的FileNameFinder本身支持Ant风格的路径匹配,我们只需要调整匹配模式,确保路径中必须包含目标子目录即可:
def basedir = "/你的基础目录路径" def targetSubdir = "SUBDIRNAMEWEKNOW" // 核心模式:**/目标子目录/**/filename.xml def file_paths = new FileNameFinder().getFileNames(basedir, "**/${targetSubdir}/**/filename.xml")
模式解释:
**/:匹配任意层级的目录(包括当前目录的父级、子级)${targetSubdir}/:强制路径中必须包含指定的子目录- 后面的
**/filename.xml:匹配目标子目录下任意层级中的filename.xml文件
这个写法会精准过滤掉所有不包含SUBDIRNAMEWEKNOW的路径,只返回符合要求的结果。
方案二:用正则表达式(适合复杂匹配场景)
如果你一定要用FileNameByRegexFinder,可以写一个精准的正则表达式,确保路径中包含目标子目录,且文件名正确:
def basedir = "/你的基础目录路径" // 正则匹配:路径中包含SUBDIRNAMEWEKNOW目录,且以filename.xml结尾 def regex = /.*[/\\]SUBDIRNAMEWEKNOW[/\\].*[/\\]filename\.xml$/ def file_paths = new FileNameByRegexFinder().getFileNames(basedir, regex)
正则解释:
.*:匹配任意长度的字符(除换行)[/\\]:兼容Windows和Linux的路径分隔符(/或\,正则中\需要转义成\)SUBDIRNAMEWEKNOW:指定的目标子目录名filename\.xml$:确保路径结尾是filename.xml(注意.在正则中要转义成.,$表示匹配字符串末尾)
如果要更严谨地避免匹配到包含目标子目录名的其他目录(比如SUBDIRNAMEWEKNOW_test),可以把正则调整为:
def regex = /(^|.*[/\\])SUBDIRNAMEWEKNOW([/\\].*|[/\\])filename\.xml$/
小提示
优先用方案一的Ant模式,因为它不需要处理正则的转义问题,代码可读性更高,Groovy对Ant路径模式的支持也非常成熟。
内容的提问来源于stack exchange,提问作者youtube2019
相关产品推荐
相关产品推荐

