如何让Apache Ant中basename任务的@suffix参数不区分大小写?
Ant中不区分大小写获取无扩展名文件名的方法
我在构建文件里声明了:
<basename property="filename" file="${args.input}" suffix="XML"/>
其中${args.input}是通过Oxygen转换场景传入的,比如-Dargs.input="${cfd}\PMC-min.XML",此时${filename}返回PMC-min,这是预期的无扩展名结果。
但把后缀改成小写后:
<basename property="filename" file="${args.input}" suffix="xml"/>
${filename}返回的是PMC-min.XML,显然@suffix参数是区分大小写的。
我可以修改${args.input}或者确保扩展名大小写匹配,但想知道Ant里有没有不区分大小写获取无扩展名文件名的方法?
方法1:结合tolower统一扩展名大小写
先提取输入文件的扩展名并转成小写,再用basename处理:
<!-- 提取原始扩展名并转为小写 --> <basename property="original.ext" file="${args.input}" suffix=""/> <propertyregex property="lower.ext" input="${original.ext}" regexp=".*\.([^\.]+)" replace="\1" casesensitive="false"/> <tolower property="lower.ext" value="${lower.ext}"/> <!-- 用统一后的小写后缀截取文件名 --> <basename property="filename" file="${args.input}" suffix=".${lower.ext}"/>
方法2:正则替换直接移除扩展名(不区分大小写)
用propertyregex任务匹配任意大小写的扩展名并直接移除:
<propertyregex property="filename" input="${args.input}" regexp="^(.*)\.[^\.]+$" replace="\1" casesensitive="false"/>
这个正则会忽略扩展名的大小写,直接截取最后一个.之前的内容。
方法3:Script任务自定义处理(灵活直接)
如果你的Ant版本支持脚本任务,用JavaScript直接处理文件名,完全不区分大小写:
<script language="javascript"> var input = project.getProperty("args.input"); var lastDot = input.lastIndexOf("."); project.setProperty("filename", lastDot !== -1 ? input.substring(0, lastDot) : input); </script>
不管扩展名是XML还是xml,都会直接截取最后一个.之前的部分作为无扩展名文件名。
内容的提问来源于stack exchange,提问作者Caroline
相关产品推荐
相关产品推荐

