0

我尝试在 filterchain ant-task 中使用 linecontainsregexp,方法是构建具有唯一服务器名称的正则表达式模式,比如 'act1' & now 属性具有如下值:

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

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

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

谢谢你。

4

1 回答 1

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" />
于 2013-09-30T17:29:23.753 回答