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} = "${propB}"" /> </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