环境:ANT 1.9.4,使用scriptdef javascript从文件名中检索版本号。
在选定的目录中,找到扩展名为.jar的文件名,获取所有文件名,遍历每个文件名以检索特定字符串并从该字符串中提取版本号。我使用scriptdef javascript来实现这一点。代码复制如下。
文件名格式是 " GeneralService_V1.2.jar" &安培; " GeneralService_V10.6_SSL.jar&#34 ;.
用于检索 Vx.x 的正则表达式是" \ V \ [0-9] + \。\ [0-9] + \ & #34; (这仅适用于第二种文件名格式)。
我收到错误 - javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:missing;在第11行的声明(#11)之前
它在模式行上失败了,我使用正确的Pattern语句还是正则表达式是错误的?
<scriptdef name="jarFiles" language="javascript">
<element name="fileset" type="fileset"/>
<![CDATA[
importClass(java.io.File);
importClass(org.apache.commons.io.FilenameUtils);
importClass(java.util.regex.Pattern);
importClass(java.lang.System);
filesets = elements.get("fileset");
for (i = 0; i < filesets.size(); ++i) {
fileset = filesets.get(i);
Pattern pat = Pattern.compile("_\\V\\[0-9]+\\.\\[0-9]+\\_");
Matcher matcher = pat.match(fileset);
if (matcher.find()) {
System.out.println(matcher.group(0)); //prints _Vx.x_
String currJarVersion = matcher.group(0);
} else {
System.out.println("Match not found");
}
]]>
</scriptdef>
<jarFiles>
<fileset id="jars" dir="${svn.jar.path}">
<include name="**/*.jar" />
</fileset>
</jarFiles>
<propertyregex property="currJarVersion"
regexp="_V"
replace=""
global="true" />
<echo message="${currJarVersion}"/>
答案 0 :(得分:2)
这段代码有很多问题......首先,你已经宣布它是JavaScript但是你正在使用Java构造,比如类型化的变量声明(Pattern pat = ...
),JavaScript没有允许。其次,正则表达式是错误的,你有太多的东西反斜杠逃脱。第三,从Matcher
创建Pattern
的方法称为matcher
,而不是match
。第四,你不能像这样对FileSet
应用正则表达式,你需要提取FileSet
匹配的文件名列表,然后将正则表达式应用于每个反过来。最后,你不是如何从脚本中设置Ant属性的。
我建议完全放弃scriptdef
,因为您可以使用pathconvert
<pathconvert pathsep=" " property="currJarVersion">
<fileset dir="${svn.jar.path}">
<include name="**/*.jar" />
</fileset>
<regexpmapper from="^.*_V([0-9]+\.[0-9]+).*$$" to="\1" /><!-- $ doubled for Ant -->
</pathconvert>