【发布时间】:2015-10-08 22:49:43
【问题描述】:
我需要一个在 Ant 中使用的正则表达式来从文件名(特别是 JAR)中删除版本号。我已经尝试了一些关于 SO 的建议并且它们在一定程度上起作用,但是我有一些我无法解决的用例。这是我的用例...
- name1-x.x.x.jar
- name1-name2-x.x.x.jar
- name1-name2-name3-x.x.x.jar
- name1.jar
- name1-name2.jar
- name1-name2-name3.jar
用例 1、2、4 和 5 是最常见的。我正在使用以下正则表达式(我从 SO 上的另一篇文章中获得并稍作调整),它适用于用例 1、2 和 3,但不适用于 4、5 和 6。我一直在测试使用这个site。
^([a-z].+)*-[0-9]*.*\.jar$
前几天我花了几个小时试图让它适用于用例 4、5 和 6,但运气为零。任何和所有的帮助将不胜感激。
谢谢!!!
编辑 10.12.2015
接受的答案非常有效,因为它提供了所需的最低结果。换句话说,如果 JAR 文件名与模式不匹配,则不返回任何内容,这意味着文件名可以按原样使用(ant-contrib 的propertyregex 的defaultValue)。我最终像这样使用它(作为测试)......
<basename property="jar.name" file="D:\SomeDir\Tomcat7\lib\commons-httpcore-4.4.2.jar"/> <!-- this would be the file name being deployed - ideally passed in as a property to a target -->
<propertyregex property="jar.base.name" override="true"
input="${jar.name}"
regexp="^(.*)-\d+\.\d+\.\d+(\.jar)$"
replace="\1*.jar"
casesensitive="false"
defaultValue="${jar.name}"/>
<echo message="Backing up/undeploying '${jar.name}' from Tomcat..." level="info"/>
<echo message="Base JAR name is: '${jar.base.name}'" level="info"/>
<!-- this will result in commons-httpcore*.jar -->
<fileset id="target.file" dir="D:\SomeDir\Tomcat7\lib" includes="**/${jar.base.name}"/>
<condition property="target.file.found" value="true" else="false">
<resourcecount refid="target.file" when="greater" count="0"/>
</condition>
<echo message="File to be backed up found? '${target.file.found}'"/>
显然,我会在上面的示例中做更多的事情,但希望我上面包含的内容可以帮助其他人实施已接受的答案。
【问题讨论】: