使用 ant scriptdef 正则表达式,获取 javascript.EvaluatorException
Using ant scriptdef regex, getting javascript.EvaluatorException
环境:ANT 1.9.4,使用 scriptdef javascript 从文件名中检索版本号。
在选定目录中,找到扩展名为 .jar 的文件名,获取所有文件名,遍历每个文件名以检索特定字符串并从该字符串中提取版本号。我使用 scriptdef javascript 来实现这一点。代码复制如下。
文件名格式为
"GeneralService_V1.2.jar"&
"GeneralService_V10.6_SSL.jar"。
用于检索 Vx.x 的正则表达式是 "\V\[0-9]+\.\[0-9]+ \"(这仅适用于第二种文件名格式)。
我遇到错误 - javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:丢失;在第 11 行的语句 (#11) 之前
它在模式行失败,是我使用了正确的模式语句还是正则表达式错误?
<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}"/>
这段代码有很多问题...首先,您已将其声明为 JavaScript 但您正在使用 Java 构造,例如类型化变量声明(Pattern pat = ...
) Java脚本不允许。其次,正则表达式是错误的,反斜杠转义的东西太多了。第三,从 Pattern
创建 Matcher
的方法称为 matcher
,而不是 match
。第四,您不能像这样将正则表达式应用于 FileSet
,您需要提取 FileSet
匹配的文件名列表,然后依次将正则表达式应用于每个文件名.最后,这不是您从脚本设置 Ant 属性的方式。
我建议完全放弃 scriptdef
,因为您可以使用 pathconvert
等原生 Ant 工具更简单地进行映射
<pathconvert pathsep=" " property="currJarVersion">
<fileset dir="${svn.jar.path}">
<include name="**/*.jar" />
</fileset>
<regexpmapper from="^.*_V([0-9]+\.[0-9]+).*$$" to="" /><!-- $ doubled for Ant -->
</pathconvert>
环境:ANT 1.9.4,使用 scriptdef javascript 从文件名中检索版本号。
在选定目录中,找到扩展名为 .jar 的文件名,获取所有文件名,遍历每个文件名以检索特定字符串并从该字符串中提取版本号。我使用 scriptdef javascript 来实现这一点。代码复制如下。
文件名格式为 "GeneralService_V1.2.jar"& "GeneralService_V10.6_SSL.jar"。
用于检索 Vx.x 的正则表达式是 "\V\[0-9]+\.\[0-9]+ \"(这仅适用于第二种文件名格式)。
我遇到错误 - javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:丢失;在第 11 行的语句 (#11) 之前
它在模式行失败,是我使用了正确的模式语句还是正则表达式错误?
<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}"/>
这段代码有很多问题...首先,您已将其声明为 JavaScript 但您正在使用 Java 构造,例如类型化变量声明(Pattern pat = ...
) Java脚本不允许。其次,正则表达式是错误的,反斜杠转义的东西太多了。第三,从 Pattern
创建 Matcher
的方法称为 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="" /><!-- $ doubled for Ant -->
</pathconvert>