replaceAnt属性中的字符

有没有一种简单的方法来取得一个财产的价值,然后将其复制到另一个财产与某些字符replace?

propA=This is a value 。 我想把它的所有空格replace成下划线,导致propB=This_is_a_value

使用Ant Contrib中的propertyregex任务。

我想你想要:

 <propertyregex property="propB" input="${propA}" regexp=" " replace="_" global="true" /> 

不幸的是,所给出的例子并不十分清楚,但值得一试。 如果没有下划线,你也应该检查会发生什么 – 你也可能需要使用defaultValue选项。

这里是没有脚本的解决scheme,也没有像ant-conrib这样的外部jar:

诀窍是使用ANT的资源:

  • 有一种名为“propertyresource”的资源types,它类似于源文件,但是从该资源的string值提供了一个stream。 所以你可以加载它,并在任何接受文件的“复制”任务中使用它
  • 还有一个任务“loadresource”可以将任何资源加载到一个属性(例如,一个文件),但是这个也可以加载我们的属性资源。 该任务允许通过应用一些令牌转换来过滤input。 最后下面将做你想要的:
 <loadresource property="propB"> <propertyresource name="propA"/> <filterchain> <tokenfilter> <filetokenizer/> <replacestring from=" " to="_"/> </tokenfilter> </filterchain> </loadresource> 

这个将用“_”replacepropA中的所有“”,并把结果放在propB中。 “filetokenizer”将整个inputstream(我们的属性)视为一个标记,并将其replace为stringreplace。

你可以使用其他的tokenfilter进行其他奇特的转换: http ://ant.apache.org/manual/Types/filterchain.html

如果ant-contrib不是一个选项,下面是Java 1.6及更高版本的一个便携式解决scheme:

 <property name="before" value="This is a value"/> <script language="javascript"> var before = project.getProperty("before"); project.setProperty("after", before.replaceAll(" ", "_")); </script> <echo>after=${after}</echo> 

如果您想要一个使用Ant内置的解决scheme,请考虑以下事项:

 <target name="replace-spaces"> <property name="propA" value="This is a value" /> <echo message="${propA}" file="some.tmp.file" /> <loadfile property="propB" srcFile="some.tmp.file"> <filterchain> <tokenfilter> <replaceregex pattern=" " replace="_" flags="g"/> </tokenfilter> </filterchain> </loadfile> <echo message="$${propB} = &quot;${propB}&quot;" /> </target> 

输出是${propB} = "This_is_a_value"

使用像sed这样的外部应用程序:

 <exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot"> <arg value="s/_/./g"/> </exec> <echo>${wersjaDot}</echo> 

如果您运行Windows,请使用Googlesearch“gnuwin32 sed”。

s/_/./g命令用_replace每个_ . 这个脚本在windows下运行得很好。 在linux下可能需要引用arg。

两种可能性:

通过脚本任务和内置的JavaScript引擎(如果使用jdk> = 1.6)

 <project> <property name="propA" value="This is a value"/> <script language="javascript"> project.setProperty('propB', project.getProperty('propA'). replace(" ", "_")); </script> <echo>$${propB} => ${propB}</echo> </project> 

或者使用Ant插件Flaka

 <project xmlns:fl="antlib:it.haefelinger.flaka"> <property name="propA" value="This is a value"/> <fl:let> propB := replace('${propA}', '_', ' ')</fl:let> <echo>$${propB} => ${propB}</echo> </project> 

改写存在的属性propA只是用propAreplacepropB

下面是Uwe Schindler的答案的一个更广泛的版本:

您可以使用macrodef来创build自定义任务。

 <macrodef name="replaceproperty" taskname="@{taskname}"> <attribute name="src" /> <attribute name="dest" default="" /> <attribute name="replace" default="" /> <attribute name="with" default="" /> <sequential> <loadresource property="@{dest}"> <propertyresource name="@{src}" /> <filterchain> <tokenfilter> <filetokenizer/> <replacestring from="@{replace}" to="@{with}"/> </tokenfilter> </filterchain> </loadresource> </sequential> </macrodef> 

你可以使用这个如下:

 <replaceproperty src="property1" dest="property2" replace=" " with="_"/> 

这将是非常有用的,如果你这样做多次

添加一个答案更完整的例子在以前的答案

 <property name="propB_" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propB_" /> <filterchain> <tokenfilter> <replaceregex pattern="\." replace="/" flags="g"/> </tokenfilter> </filterchain> </loadresource> 

只是一个FYI的答案replaceAnt属性中的字符 – 如果你想在一个Maven执行中使用这个,你不能直接引用Mavenvariables。 你将需要这样的东西:

 ... <target> <property name="propATemp" value="${propA}"/> <loadresource property="propB"> <propertyresource name="propATemp" /> ... 

或者…你也可以尝试你自己的任务

JAVA代码:

 class CustomString extends Task{ private String type, string, before, after, returnValue; public void execute() { if (getType().equals("replace")) { replace(getString(), getBefore(), getAfter()); } } private void replace(String str, String a, String b){ String results = str.replace(a, b); Project project = getProject(); project.setProperty(getReturnValue(), results); } ..all getter and setter.. 

ANT SCRIPT

 ... <project name="ant-test" default="build"> <target name="build" depends="compile, run"/> <target name="clean"> <delete dir="build" /> </target> <target name="compile" depends="clean"> <mkdir dir="build/classes"/> <javac srcdir="src" destdir="build/classes" includeantruntime="true"/> </target> <target name="declare" depends="compile"> <taskdef name="string" classname="CustomString" classpath="build/classes" /> </target> <!-- Replacing characters in Ant property --> <target name="run" depends="declare"> <property name="propA" value="This is a value"/> <echo message="propA=${propA}" /> <string type="replace" string="${propA}" before=" " after="_" returnvalue="propB"/> <echo message="propB=${propB}" /> </target> 

安慰:

 run: [echo] propA=This is a value [echo] propB=This_is_a_value 
    Interesting Posts