ant字符串操作:从字符串中提取字符

时间:2011-02-10 08:52:34

标签: java regex ant

我有一个ant属性,其值为1.0.0.123

我想在最后一个点之后提取值,在这种情况下将是'123'。 我应该使用哪个蚂蚁任务以及如何使用?

6 个答案:

答案 0 :(得分:10)

我怀疑最简单的方法可能是使用ant-contrib PropertyRegex task

这样的事情 - 完全未经测试:

<propertyregex property="output"
          input="input"
          regexp=".*([^\.]*)"
          select="\1" />

答案 1 :(得分:9)

使用本机ant任务

如果不想使用外部库或脚本,我在an answer to a similar question找到了最好的选择(相信他的答案)。在这里,您将使用ReplaceRegex

<loadresource property="index">
  <propertyresource name="build.number"/>
  <filterchain>
    <tokenfilter>
      <filetokenizer/>
      <replaceregex pattern=".*\.)" replace="" />
    </tokenfilter>
  </filterchain>
</loadresource>

(我在您的解决方案中使用了与您相同的变量名称。当然,这仍然缺少答案的增量部分,但这不在您的问题中。)

此脚本在index中加载了从.*\.)删除正则表达式build.number的结果,即build.number = 1.0.0.123然后index = 123


实施例

build.xml:

<project name="ParseBuildNumber" default="parse" basedir=".">
    <property name="build.number" value="1.0.0.123"/>

    <target name="parse">
        <loadresource property="index">
            <propertyresource name="build.number"/>
            <filterchain>
                <tokenfilter>
                    <filetokenizer/>
                    <replaceregex pattern=".*\." replace="" />
                </tokenfilter>
            </filterchain>
        </loadresource> 
        <echo message="build.number=${build.number}; index=${index}"/>
    </target>

</project>
$ ant
Buildfile: /tmp/build.xml

parse:
     [echo] build.number=1.0.0.123; index=123

BUILD SUCCESSFUL
Total time: 0 seconds

答案 2 :(得分:8)

好的,我自己找到了答案并且已经过测试。 你只需要使用一些javascript。

<target name="get build ctr">

    <script language="javascript">
        <![CDATA[

                // getting the value
                buildnumber = myproj.getProperty("build.number");
                index = buildnumber.lastIndexOf(".");
                counter = buildnumber.substring(index+1);
                myproj.setProperty("buildctr",counter);

            ]]>
    </script>

</target>

答案 3 :(得分:7)

<propertyregex property="xtractedvalue" 
               input="${foobar}" 
               regexp="(.*)\.(.*)$" 
               select="\2" />

答案 4 :(得分:1)

这是使用flaka而不使用脚本=

的解决方案
<project xmlns:fl="antlib:it.haefelinger.flaka">

 <property name="foobar" value="1.0.0.123"/>

  <target name="main">   
   <!-- simple echo -->
   <fl:echo>xtractedvalue => #{split('${foobar}','\.')[3]}</fl:echo>
   <!-- create property for further processing.. -->
   <fl:let>
    xtractedvalue := split('${foobar}','\.')[3]
   </fl:let>
   <echo>$${xtractedvalue} => ${xtractedvalue}</echo> 
  </target> 
</project>

答案 5 :(得分:1)

我还会使用ant-contrib PropertyRegex任务。 以下代码段仅在输入字符串符合您在说明中使用的约定时才有效,您还可以通过更改在select标记中输入的值来使用它来提取其他数字。

<propertyregex property="output"
          input="input"
          regexp="(\d)\.(\d)\.(\d)\.(\d{3})"
          select="\4" />

如果输入字符串不符合约定,您还可以使用输出字符串上的issest任务打印出错误消息,因为不会设置输出属性。