Ant Regex替换问题

时间:2017-12-13 20:38:48

标签: regex ant

您好我想要替换/添加(-SNAPSHOT)到pom.xml中的版本。如果版本是1.1.1我想要1.1.1-SNAPSHOT并且它已经是SNAPSHOT保持不变。

目前我有这个

<propertyregex property="snapshotVersionRepl"
                              input="${pom.project.version}"
                              regexp="(.*)(-SNAPSHOT)?"
                              replace="\1-SNAPSHOT"
                              casesensitive="false" />

但是输入1.0.0我得到1.0.0-SNAPSHOT-SNAPSHOT,而1.0.0-SNAPSHOT我得到1.0.0-SNAPSHOT-SNAPSHOT-SNAPSHOT。

2 个答案:

答案 0 :(得分:1)

您可以通过添加锚点并使第一个.*懒惰来修复模式:

regexp="^(.*?)(-SNAPSHOT)?$"

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • (.*?) - 第1组:除了换行符之外的任何0 +字符,尽可能少
  • (-SNAPSHOT)? - 可选的-SNAPSHOT序列
  • $ - 字符串结束。

答案 1 :(得分:0)

首先,我建议避免使用ant-contrib,因为它往往会促进Ant脚本中的不良做法。任何类型的字符串操作都可以通过本机Ant的filterchain类型来完成。

关于你的正则表达式,Wiktor的模式有效,但在这种情况下,我更喜欢使用负面的lookbehind。

测试目标:

<target name="replace-version">
    <property name="pom.project.version1" value="1.1.1" />

    <loadresource property="snapshotVersionRepl1">
        <propertyresource name="pom.project.version1" />
        <filterchain>
            <tokenfilter>
                <replaceregex pattern="(.*)(?&lt;!-SNAPSHOT)$" replace="\1-SNAPSHOT" />
            </tokenfilter>
        </filterchain>
    </loadresource>

    <echo>${snapshotVersionRepl1}</echo>

    <property name="pom.project.version2" value="1.1.1-SNAPSHOT" />

    <loadresource property="snapshotVersionRepl2">
        <propertyresource name="pom.project.version2" />
        <filterchain>
            <tokenfilter>
                <replaceregex pattern="(.*)(?&lt;!-SNAPSHOT)$" replace="\1-SNAPSHOT" />
            </tokenfilter>
        </filterchain>
    </loadresource>

    <echo>${snapshotVersionRepl2}</echo>
</target>

输出:

 [echo] 1.1.1-SNAPSHOT
 [echo] 1.1.1-SNAPSHOT

请注意,使用&lt;代替<以避免破坏XML语法。