【问题标题】:substring operation using antcontib's properyregex task使用antcontib的properyregex任务进行子串操作
【发布时间】:2012-08-01 05:10:45
【问题描述】:

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

COMPONENT:MYBuild:cat:cat

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

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

但这让我着迷

 COMPONENT:MYBuild:cat:

有人可以帮忙吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 嗨@David W。我在实施此解决方案时发现了一个新问题。大多数情况下,搜索字符串是 COMPONENT:MYBuild:cat:cat,但有时搜索字符串是 COMPONENT:MYBuild:cat:cat:cat1:cat2。当我使用以下 正常情况下,取前四个参数,其他超过4个参数时,选择整个序列。
    • 我刚刚在Test:one:two:three:four:five:six 上测试了我给你的解决方案。它按照预期选择了one。你是说你想要的会根据项目的数量而变化吗?
    • 是的,大卫。所以现在我已经像下面这样使用了 ant flaka。 builderName ::= split('${componentLine}', ':')[1] 感谢您的回复。
    【解决方案2】:

    您不需要正则表达式,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

    【讨论】:

    • 嗨@Rebse,当我使用flaka标签时,我在if循环(第196行)上收到以下错误,其中包含使用flaka /afs/btv.ibm.com/data/的此字符串操作aes/ANT_REG/build.xml:196: java.lang.UnsupportedClassVersi onError: it/haefelinger/flaka/dep/Select (Unsupported major.minor version 49.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang .ClassLoader.defineClass(ClassLoader.java(Compiled Code)) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java(Compiled Code)) at java.net.URLClassLoader.defineClass(URLClassLoader.java(Compiled Code)
    • 您收到错误“Unsupported major.minor version 49.0”,因为 Flaka 是使用 java 1.5 编译的,并且您使用的是较早的 java 版本,即 1.4 - 在控制台中使用“java -version”检查;出于安全原因,您应该切换到最新的 java 版本,即 1.6.0_33 或 1.7.0_05
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多