使用ant从属性中获取属性值 - 可以使用propertyregex

时间:2013-09-30 15:18:00

标签: ant

我尝试在filterchain ant-task中使用linecontainsregexp,通过构建regexp模式来保存唯一的服务器名称'act1'&现在财产保持这样的价值:

<Server name="act1" value="ServerName" port="1234"></Server>

如何获取单个属性名称?例如,如果我想获得端口#,如何检索它。我尝试过类似的东西:

<propertyregex property="extracted.prop" input="${server.details}"
                               regexp="(.*)\\ *@@" select="\1" />
谢谢。

1 个答案:

答案 0 :(得分:1)

下面的代码应该可以提取三个属性中的每一个。首先,请注意我正在加载整个xml文件。没有必要像你一样提取特定的行。其次,我写它足够灵活,允许Server属性中的换行符,并允许属性的任何顺序。

我看到你特别挣扎着正则表达式。为了您的理解,我将打破第一个正则表达式:

(?s)    // DOTALL flag. Causes the . wildcard to match newlines.
\x3c    // The < character. For reasons I don't understand, `propertyregex` doesn't allow <
Server  // Match 'Server' literally
.*?     // Reluctantly consume characters until...
name=   // 'name=' is reached
&quot;  // Because ant is an XML file, we must use this escape sequence for "
(.*?)   // Reluctantly grab all characters in a capturing group until...
&quot;  // another double quote is reached.

最后是XML:

<loadfile property="server.details" srcfile="${baseDir}/build/myTest.xml"/>
<propertyregex property="server.name"  
               input="${server.details}" 
               regexp="(?s)\x3cServer.*?name=&quot;(.*?)&quot;" 
               select="\1" />
<propertyregex property="server.value" 
               input="${server.details}" 
               regexp="(?s)\x3cServer.*?value=&quot;(.*?)&quot;" 
               select="\1" />
<propertyregex property="server.port"  
               input="${server.details}" 
               regexp="(?s)\x3cServer.*?port=&quot;(.*?)&quot;" 
               select="\1" />