0

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

COMPONENT:MYBuild:cat:cat

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

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

但这让我着迷

 COMPONENT:MYBuild:cat:

有人可以帮忙吗?

4

2 回答 2

0

正则表达式的巧妙之处之一是使用[^x]which 表示除 . 之外的任何字符x。当您必须阻止正则表达式的贪婪时,这是一件好事。例如,[^:]*表示选择直到下一个冒号的所有字符:

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

第一[^:]*:场比赛COMPONENT:。这表示匹配不包含冒号的整个字符串,以及它后面的冒号。(你明白这是如何工作的吗?)

接下来的([^:]*)比赛MyBuild。它与第一个类似,只是它没有冒号,因此MyBuild不会包含冒号。它被括号包围,因为我想捕获它。

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

我没有对此进行测试,但它应该可以工作,或者至少为您指明正确的方向。

于 2012-08-03T20:33:48.080 回答
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手册示例

于 2012-08-03T16:53:17.337 回答