使用 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="&#10;" property="currJarVersion">
  <fileset dir="${svn.jar.path}">
    <include name="**/*.jar" />
  </fileset>
  <regexpmapper from="^.*_V([0-9]+\.[0-9]+).*$$" to="" /><!-- $ doubled for Ant -->
</pathconvert>