是否有一种简单的方法来获取属性的值,然后将其复制到另一个属性并替换某些字符?
说propA=This is a value
。我想将其中的所有空格替换为下划线,从而产生propB=This_is_a_value
。
答案 0 :(得分:95)
这是没有脚本的解决方案,也没有像ant-conrib这样的外部jar:
诀窍是使用ANT的资源:
<loadresource property="propB">
<propertyresource name="propA"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<replacestring from=" " to="_"/>
</tokenfilter>
</filterchain>
</loadresource>
这个将用“_”替换propA中的所有“”,并将结果放在propB中。 “filetokenizer”将整个输入流(我们的属性)视为一个标记,并在其上应用字符串替换。
您可以使用其他令牌过滤器进行其他奇特的转换:http://ant.apache.org/manual/Types/filterchain.html
答案 1 :(得分:87)
使用propertyregex中的Ant Contrib任务。
我想你想要:
<propertyregex property="propB"
input="${propA}"
regexp=" "
replace="_"
global="true" />
不幸的是,给出的例子并不十分清楚,但值得尝试。如果没有任何下划线,您还应该检查会发生什么 - 您可能还需要使用defaultValue
选项。
答案 2 :(得分:55)
如果ant-contrib不是一个选项,这里是Java 1.6及更高版本的可移植解决方案:
<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>
答案 3 :(得分:26)
如果您需要使用Ant内置插件 的解决方案,请考虑以下事项:
<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"
答案 4 :(得分:8)
使用像sed这样的外部应用程序:
<exec executable="sed" inputstring="${wersja}" outputproperty="wersjaDot">
<arg value="s/_/./g"/>
</exec>
<echo>${wersjaDot}</echo>
如果您运行Windows,请使用Google搜索“gnuwin32 sed”。
命令s/_/./g
用_
替换每个.
这个脚本在windows下很顺利。在linux下,arg可能需要引用。
答案 5 :(得分:8)
两种可能性:
通过脚本任务和内置javascript引擎(如果使用jdk&gt; = 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>
<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只需用propA替换propB
答案 6 :(得分:6)
这是Uwe Schindler's answer的更通用版本:
您可以使用macrodef
创建自定义任务。
<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="_"/>
如果您多次这样做,这将非常有用
答案 7 :(得分:3)
<property name="propB_" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propB_" />
<filterchain>
<tokenfilter>
<replaceregex pattern="\." replace="/" flags="g"/>
</tokenfilter>
</filterchain>
</loadresource>
答案 8 :(得分:1)
只是回答Replacing characters in Ant property的一个FYI - 如果你试图在maven执行中使用它,你就不能直接引用maven变量。你需要这样的东西:
...
<target>
<property name="propATemp" value="${propA}"/>
<loadresource property="propB">
<propertyresource name="propATemp" />
...
答案 9 :(得分:1)
属性无法更改,但antContrib vars(http://ant-contrib.sourceforge.net/tasks/tasks/variable_task.html)可以更改。
这里是一个宏,用于在var上进行查找/替换:
public boolean uploadFileDirectlyToS3(MultipartFile multipartFile, String keyName) {
ObjectMetadata data = new ObjectMetadata();
try {
data.setContentType(multipartFile.getContentType());
data.setContentLength(multipartFile.getSize());
s3Client.putObject(CORE_BUNDLE.getString("bucket.name"), keyName, multipartFile.getInputStream(), data);
//KeyName is the specific and unique path where you wanna place your file in s3
return true;
} catch (Exception e) {
logger.error("Error occured while uploading file to s3 having name: "+multipartFile.getOriginalFilename(), e);
return false;
}
}
然后像这样调用宏:
<macrodef name="replaceVarText">
<attribute name="varName" />
<attribute name="from" />
<attribute name="to" />
<sequential>
<local name="replacedText"/>
<local name="textToReplace"/>
<local name="fromProp"/>
<local name="toProp"/>
<property name="textToReplace" value = "${@{varName}}"/>
<property name="fromProp" value = "@{from}"/>
<property name="toProp" value = "@{to}"/>
<script language="javascript">
project.setProperty("replacedText",project.getProperty("textToReplace").split(project.getProperty("fromProp")).join(project.getProperty("toProp")));
</script>
<ac:var name="@{varName}" value = "${replacedText}"/>
</sequential>
</macrodef>
上面的代码使用javascript拆分然后加入,比regex更快。 “本地”属性会传递给JavaScript,因此不会出现属性泄漏。
答案 10 :(得分:0)
或者......您也可以尝试Your Own Task
JAVA CODE:
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>
CONSOLE:
run:
[echo] propA=This is a value
[echo] propB=This_is_a_value