如何使用ant来提取文件中的所有子字符串而不使用正则表达式

时间:2013-05-25 23:45:24

标签: ant ant-contrib

我有一个文件有很多行,如:

aaa  bbb  ccc  ddd  eeee
a111 b111 c111 d111
A222 B222 X222 Y222 Z222
FFF  GGG  HHH

我希望使用ant来提取此文件中的所有子字符串

aaa  bbb  ccc  ddd  eeee
a111 b111 c111 d111
A222 B222 X222 Y222 Z222
FFF  GGG  HHH

在每一行,即 所有aaa bbb ccc ddd eee在第1行, 所有FFF GGG HHH在最后一行等

请帮忙怎么做但不使用正则表达式???

我的代码是:

<for list="@{line}"  delimiter=" " param = "val">
                <sequential>
                    <echo>in sequential : @{line}</echo>
                        <var name="first.part" value="1"/>
                        <var name="second.part" value="2"/>
                        <var name="third.part" value="3"/>
                        <propertyregex
                            property="first.part"
                            input="@{line}"
                            select="\0"/>
                        <propertyregex
                            property="second.part"
                            input="@{line}"
                            select="\1"/>
                        <propertyregex
                            property="third.part"
                            input="@{line}"
                            select="\2"/>
                        <echo> after assign: 1st.part = ${first.part}</echo>
                        <echo> after assign: 2nd.part = ${second.part}</echo>
                        <echo> after assign: 3rd.part = ${third.part}</echo>
            </sequential>

</for>

但是ant 1.6不支持正则表达式, 我收到了错误: 该类型不支持&#34; regex&#34;属性。

如何解决? 感谢

1 个答案:

答案 0 :(得分:1)

ANT不是一种编程语言。你最好建议嵌入一个。

以下示例使用groovy

<project name="demo" default="scan">

    <target name="bootstrap">
        <mkdir dir="${user.home}/.ant/lib"/>
        <get dest="${user.home}/.ant/lib/groovy.jar" src="http://search.maven.org/remotecontent?filepath=org/codehaus/groovy/groovy-all/2.1.3/groovy-all-2.1.3.jar"/>
    </target>

    <target name="scan">
        <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy"/>
        <groovy>
        new File("File1.txt").eachLine {
            def values = it.split()

            ant.echo "Extracted values: ${values}"

            values.each {
                ant.echo "Need to so something with ${it}"
            }
        }
        </groovy>
    </target>

</project>

生成以下输出

scan:
     [echo] Extracted values: [aaa, bbb, ccc, ddd, eeee]
     [echo] Need to so something with aaa
     [echo] Need to so something with bbb
     [echo] Need to so something with ccc
     [echo] Need to so something with ddd
     [echo] Need to so something with eeee
     [echo] Extracted values: [a111, b111, c111, d111]
     [echo] Need to so something with a111
     [echo] Need to so something with b111
     [echo] Need to so something with c111
     [echo] Need to so something with d111
     [echo] Extracted values: [A222, B222, X222, Y222, Z222]
     [echo] Need to so something with A222
     [echo] Need to so something with B222
     [echo] Need to so something with X222
     [echo] Need to so something with Y222
     [echo] Need to so something with Z222
     [echo] Extracted values: [FFF, GGG, HHH]
     [echo] Need to so something with FFF
     [echo] Need to so something with GGG
     [echo] Need to so something with HHH

更新

启用groovy任务的另一种方法是使用类路径引用,如下所示:

<path id="build.path">
    <pathelement location="/path/to/groovy-all/jar/groovy-all-2.1.3.jar"/>
</path>

<taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>