【问题标题】:Ant matches giving false positives蚂蚁匹配给出误报
【发布时间】:2013-05-27 14:59:54
【问题描述】:

我正在尝试在匹配任务的帮助下处理/跳过任务。 但我得到“误报”,当我认为它应该返回 false 时,匹配返回 true。
正在使用以下代码:

<property name="moduleList" value="AP|MR"/>
<echo message="ModuleList is ${moduleList}" />
...some for loop here...
<echo message="Found ${zipFilename}" />
<if>
    <matches pattern="${moduleList}" string="${zipFilename}" />
    <then>
        <echo message="Creating ${zipFilename}" />
    </then>
    <else>
        <echo message="Skipping ${zipFilename}" />
    </else>
</if>

zipfileName 是通过遍历文件夹并获取文件的基本名称来确定的,遇到的 zipfileNames 是 AP、MR 和 VAP
这段代码的结果是:

[echo] ModuleList is AP|MR
[echo] Found AP
[echo] Creating AP
[echo] Found MR
[echo] Creating MR
[echo] Found VAP
[echo] Creating VAP
[echo] Found eFormsPolicy
[echo] Skipping eFormsPolicy

所以在我看来,VAP 是误报。
还是我的火柴有问题?

AFAIK ant.regexp.regexpimpl 没有设置,所以 ant 使用的是 Jdk14Regexp 实现

【问题讨论】:

    标签: regex ant-contrib


    【解决方案1】:

    您是否会因为VAPAP 结尾而得到误报?如果您将匹配模式更改为^(${moduleList})$ 会怎样?实际代入moduleList时,会变成^(AP|MR)$,与VAP不匹配。

    【讨论】:

    • +1 - 尽管它的名字,&lt;matches&gt; 使用 Matcher.find(),而不是 matches(),如果你想将匹配锚定到末尾,则需要 ^$字符串。
    • 就是这样,我怀疑它与正则表达式有关,但我的正则表达式知识并不是那么好。 (@Ian 通过它的行为我也怀疑它在使用 find)
    • 这样做的一个陷阱是,在一个空的 moduleList 匹配任何东西之前。现在它什么都不匹配。所以我需要添加一个&lt;or&gt;&lt;equals arg1="${moduleList}" arg2="" /&gt;&lt;matches goes here&gt;&lt;/or&gt; 或在moduleList 为空时用.* 填充
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-22
    • 2021-12-24
    • 1970-01-01
    • 2020-05-11
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多