我正在尝试使用antcontrib的propertyregex进行子字符串操作。这是我原来的字符串:
COMPONENT:MYBuild:cat:cat
我试图从上面的字符串中提取MYBuild
。
<propertyregex property="builderName"
input="${componentLine}"
regexp="(.*)COMPONENT:.*:"
replace=""
casesensitive="true"
override="true"/>
但这让我感动
COMPONENT:MYBuild:cat:
有人可以帮忙吗?
答案 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 Manual和Examples。
答案 1 :(得分:0)
关于正则表达式的一个巧妙的事情是使用[^x]
,这意味着x
之外的任何字符。当你不得不挫败正则表达式的贪婪时,这是一件好事。例如,[^:]*
表示选择直到下一个冒号的所有字符:
<propertyregex property="builderName"
input="${componentLine}"
regexp="[^:]*:([^:]*)"
select="\1"
override="true"/>
第一个[^:]*:
匹配COMPONENT:
。这表示匹配不包含冒号的整个字符串以及跟随它的冒号。 (你看这是如何工作的?)
下一个([^:]*)
匹配MyBuild
。它与第一个类似,只是它没有冒号,因此MyBuild
后面的冒号不会被包括在内。它被括号括起来,因为我想抓住它。
我使用replace
参数代替select
参数,这允许我说我想用第一个捕获组替换整个字符串(括号中的内容)。
我没有对此进行过测试,但它应该可行,或者至少指向正确的方向。