使用antcontib的properyregex任务进行子串操作

时间:2012-08-03 07:03:54

标签: regex ant regex-negation regex-greedy ant-contrib

我正在尝试使用antcontrib的propertyregex进行子字符串操作。这是我原来的字符串:

COMPONENT:MYBuild:cat:cat

我试图从上面的字符串中提取MYBuild

<propertyregex property="builderName"
     input="${componentLine}"
     regexp="(.*)COMPONENT:.*:"
     replace=""
     casesensitive="true"
     override="true"/>

但这让我感动

 COMPONENT:MYBuild:cat:

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

你不需要正则表达式,And addon Flaka它很简单:

<project xmlns:fl="antlib:it.haefelinger.flaka">
 <property name="componentLine" value="COMPONENT:MYBUILD:cat:cat"/>
  <fl:let>
   builderName := split('${componentLine}', ':')[1]
  </fl:let>
  <echo>$${builderName} => ${builderName}</echo>
</project>

输出:

 [echo] ${builderName} => MYBUILD

Flaka也有其他功能,如果你需要正则表达式,请使用replace()
有关详细信息,请参阅Flaka ManualExamples

答案 1 :(得分:0)

关于正则表达式的一个巧妙的事情是使用[^x],这意味着x之外的任何字符。当你不得不挫败正则表达式的贪婪时,这是一件好事。例如,[^:]*表示选择直到下一个冒号的所有字符:

<propertyregex property="builderName"
     input="${componentLine}"
     regexp="[^:]*:([^:]*)"
     select="\1"
     override="true"/>

第一个[^:]*:匹配COMPONENT:。这表示匹配不包含冒号的整个字符串以及跟随它的冒号​​。 (你看这是如何工作的?)

下一个([^:]*)匹配MyBuild。它与第一个类似,只是它没有冒号,因此MyBuild后面的冒号不会被包括在内。它被括号括起来,因为我想抓住它。

我使用replace参数代替select参数,这允许我说我想用第一个捕获组替换整个字符串(括号中的内容)。

我没有对此进行过测试,但它应该可行,或者至少指向正确的方向。