【问题标题】:Ant-Contrib Equals Ignore CaseAnt-Contrib 等于忽略大小写
【发布时间】:2013-01-08 15:13:33
【问题描述】:

有没有办法检查两个值是否相等而不考虑大小写?例如“myValue”等于“myvalue”不区分大小写。

<if>
    <equals arg1="myValue" arg2="myvalue" />
    <then>
        ...
    </then>
</if>

【问题讨论】:

    标签: ant ant-contrib


    【解决方案1】:

    ant-contrib 很烂。它通常会导致意大利面条式的代码非常难以阅读 - 并且需要人们添加 ant-contrib jars。
    您通常最好让 ant 成为蚂蚁……它不是一种脚本语言,而是构建步骤的简单声明。如果你想变得花哨,你可以通过在 java 中编写你自己的任务来做到这一点,你有一个 IDE、调试器和单元测试。

    在 ant 中,您可以使用 &lt;condition&gt; 任务,特别是 &lt;equals&gt;casesensitive="false" 来设置属性,然后根据该属性有条件地运行目标。例如,用ant -Darg1="foo" -Darg2="foo" 运行这个家伙

    <?xml version="1.0" encoding="utf-8"?>
    <project name="condition" default="condition-true" basedir=".">
    
    <condition property="strings-match">
        <equals arg1="${arg1}" arg2="${arg2}" casesensitive="false"/>
    </condition>
    
    <target name="display-props">
        <echo>"arg1 = ${arg1}"</echo>
        <echo>"arg2 = ${arg2}"</echo>
        <echo>"strings-match = ${strings-match}"</echo>
    </target>
    
    <target name="condition-true" depends="display-props" if="${strings-match}">
        <echo>true</echo>
    </target>
    </project>
    

    我知道这并不能回答您的问题,特别是关于 ant-contrib。我什至会进一步误入歧途,说我永远不会制作新的 ant 文件(更喜欢 gradle 或 maven)有趣的阅读:

    【讨论】:

    • 经过进一步研究,equals 不是 Ant-Contrib 的一部分,而是您提到的 Ant Condition Task 的一部分。因此,即使我使用的是 Ant-Contrib 的 标签, 也是 Ant 的一部分。进一步的文档指出默认情况下区分大小写(执行区分大小写的比较。)默认为 true。
    【解决方案2】:

    您可以像这样使用casesensitive="false" 参数:

    <if>
        <equals arg1="myValue" arg2="myvalue" casesensitive="false" />
        <then>
            ...
        </then>
    </if>
    

    来源:https://ant.apache.org/manual/Tasks/conditions.html

    【讨论】:

      【解决方案3】:

      我打赌你可以使用&lt;matches&gt; 条件来做到这一点。 &lt;matches&gt; 条件可以将字符串与正则表达式进行比较,并且可以不区分大小写。只需使您匹配正则表达式的字符串。

      就在我的脑海中:

      <property name="arg1" value="MY_VALUE"/>
      <property name="arg2" value="my_value"/>
      <if>
          <matches
              string="${arg1}"
              pattern="^${arg2}$"
              casesensitive="false">
          <then>
                <echo>${arg1} and ${arg2} are the same, but may differ in case</echo>
          </then>
      </if>
      

      【讨论】:

      • 很好地使用火柴,尽管&lt;equals&gt; 也能胜任。
      【解决方案4】:

      我不认为您可以在&lt;if&gt; 中执行此操作。但是,您可以添加一个小的 javascript。

      <script language="javascript"> 
        <![CDATA[
        // getting value for myValue
        myValue = test.getProperty("myValue");  
        // TODO add some check here to handle empty property value
        // convert to uppercase 
        valueUpper = myValue.toUpperCase();  
        // store the result in a new property 
        test.setProperty("myValue.upper",valueUpper); 
         ]]> 
      </script>
      
      <if>
          <equals arg1="${myValue.upper}" arg2="MYVALUE" />
          <then>
              ...
          </then>
      </if>
      

      注意test 引用了您的 ant 项目名称。

      或者,您可以寻找另一个 ant-contrib 函数 propertyRegex。由于我没有找到一个工作示例如何利用它将字符串转换为大写或小写,我认为 javascript 是更好的选择。

      【讨论】:

        猜你喜欢
        • 2014-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多