我需要从给定的URL拆分字符串并将其存储在属性中。
例如:Url:projectname / qa / projectid / version 属性需要存储: 名称=项目名称 模式= QA ID =专案编号 版本=版本
答案 0 :(得分:7)
使用内置的javascript引擎(JDK> = 1.6.06)和ant script task:
<project>
<property name="url" value="projectname/qa/projectid/version"/>
<script language="javascript">
arr = project.getProperty('url').split('/');
project.setProperty('Name', arr[0]);
project.setProperty('Mode', arr[1]);
project.setProperty('Id', arr[2]);
project.setProperty('Version', arr[3]);
</script>
<echo>
$${Name} => ${Name}
$${Mode} => ${Mode}
$${Id} => ${Id}
$${Version} => ${Version}
</echo>
</project>
输出:
[echo] ${Name} => projectname
[echo] ${Mode} => qa
[echo] ${Id} => projectid
[echo] ${Version} => version
将其包裹在macrodef或scriptdef中以便重复使用(相当于编写新的蚂蚁任务)。
如果您更喜欢使用一些ant插件而不是ant脚本任务,请参阅Ant Flaka,它有多种字符串操作的可能性,请参阅manual和examples。
- 编辑 -
split与regexp一起工作,f.e。 :
<project>
<property name="url" value="Chico.Harpo.Groucho.Gummo.Zeppo"/>
<script language="javascript">
<![CDATA[
// won't work because special meaning of '.' as wildcard
// arr = project.getProperty('url').split('.');
// so either use
// masking as character class '[.]' or '\\.'
arr = project.getProperty('url').split('[.]');
for (i=0; i < arr.length; i++)
{
print(arr[i]);
}
]]>
</script>
</project>
答案 1 :(得分:3)
只是为了展示Rebse的script
方法的替代方案,这里有一个更长篇大论的正则表达方式。您可以使用以下块来提取每个属性:
<property name="url" value="projectname/qa/projectid/version"/>
<loadresource property="Name">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="(\w+)/(\w+)/(\w+)/(\w+)" replace="\1"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="Name: ${Name}"/>
要从评论中回答您的问题,下面是一个示例,说明如何使用该方法提取所需的部分。我没说它很漂亮......
<target name="test">
<property name="url" value="http://svn.abc.com/builds/abcd/qa/FACC790C-1480-49F7-80F6-B91B07E52DA9/v1.0.1/r5532/"/>
<echo message="url: ${url}"/>
<loadresource property="a">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="http://([^/]+)/([^/]+)/([^/]+)/(?:[^/]+)/([^/]+)/v([^/]+)/r([^/]+)/" replace="\1"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="a: ${a}"/>
<loadresource property="b">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="http://([^/]+)/([^/]+)/([^/]+)/(?:[^/]+)/([^/]+)/v([^/]+)/r([^/]+)/" replace="\2"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="b: ${b}"/>
<loadresource property="c">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="http://([^/]+)/([^/]+)/([^/]+)/(?:[^/]+)/([^/]+)/v([^/]+)/r([^/]+)/" replace="\3"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="c: ${c}"/>
<loadresource property="d">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="http://([^/]+)/([^/]+)/([^/]+)/(?:[^/]+)/([^/]+)/v([^/]+)/r([^/]+)/" replace="\4"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="d: ${d}"/>
<loadresource property="e">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="http://([^/]+)/([^/]+)/([^/]+)/(?:[^/]+)/([^/]+)/v([^/]+)/r([^/]+)/" replace="\5"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="e: ${e}"/>
<loadresource property="f">
<string value="${url}"/>
<filterchain>
<tokenfilter>
<replaceregex pattern="http://([^/]+)/([^/]+)/([^/]+)/(?:[^/]+)/([^/]+)/v([^/]+)/r([^/]+)/" replace="\6"/>
</tokenfilter>
</filterchain>
</loadresource>
<echo message="f: ${f}"/>
</target>
输出:
test:
[echo] url: http://svn.abc.com/builds/abcd/qa/FACC790C-1480-49F7-80F6-B91B07E52DA9/v1.0.1/r5532/
[echo] a: svn.abc.com
[echo] b: builds
[echo] c: abcd
[echo] d: FACC790C-1480-49F7-80F6-B91B07E52DA9
[echo] e: 1.0.1
[echo] f: 5532
总而言之,每次重复使用相同的模式,但选择不同的组(1-4)。该模式使用6个捕获和1个非捕获组(对于/ qa / part)。你可以做很多其他方法。