csv匹配中的ANT元素

时间:2011-02-17 14:38:07

标签: java regex ant

我需要编写一个正则表达式来匹配逗号分隔列表中的元素,忽略,附近的空格。 例如: elem1, elem2 ,elem3, elem4 ,elem5 ,elem6

以下任何一项:elem1 elem2 elem3 elem4 elem5 elem6应匹配。

不允许使用尾随逗号(在行尾之前)。

我尝试了这种模式:
pattern="(^|/,)\s*@{value}\s*(/,|$)"
但它不起作用。 (假阴性)

我该怎么做?我的错了什么?

感谢。

3 个答案:

答案 0 :(得分:1)

插值是你的问题。并且,你不能消费两边的','你只能在一边消费它。

编辑 - 如果您是在全球范围内搜索,那么您就不能在双方使用逗号。例如,如果你想找到所有的东西。如果它只是找到第一个匹配,那么双方的逗号都可以。我不知道java,但是,你不能只是将列表放入正则表达式并期望它匹配,除非它首先设置为替换。像"(?:^|,)\\s*(?:elem4|elem6)\\s*(?=,|\$)"一样。当然,您需要在空格\\s上进行另一次转义。

$value = '(elem.)';  
$rx    = "(?:^|,)\\s*$value\\s*(?=,|\$)";

$rx    = '(?:^|,)\s*(elem.)\s*(?=,|$)';

Perl:

use strict;
use warnings;

my $value = '(elem.)';

my $str = ' elem1, elem2 ,elem3, elem4 ,elem5 ,elem6 ';

my $rx = "(?:^|,)\\s*$value\\s*(?=,|\$)";

while ( $str =~ /$rx/g ) {
   print "'$1'\n";
}

输出

'elem1'
'elem2'
'elem3'
'elem4'
'elem5'
'elem6'

答案 1 :(得分:0)

如果csv列表包含特殊值,则需要测试上一个问题。这是一项不同的任务 - 也是一项不同的蚂蚁任务:

<macrodef name="csvcontains">
    <attribute name="value"/>
    <attribute name="list"/>
    <attribute name="casesensitive" default="false"/>
    <sequential>
    <condition property="matched" else="false">
        <contains string="@{list}" substring="@{value}" casesensitive="@{casesensitive}"/>
    </condition>
    </sequential>
</macrodef>

(您可以考虑将属性matched重命名为contained

答案 2 :(得分:0)

我找到了一个解决方案:

模式

^(.+,\s*|\s*)@{value}(\s*|\s*,.+)$

用法示例是

<macrodef name="csvcontains">
    <attribute name="value"/>
    <attribute name="list"/>
    <attribute name="propertyName"/>
    <attribute name="casesensitive" default="false"/>
    <sequential>
        <condition property="@{propertyName}" else="false">
            <or>
                <isset property="@{propertyName}"/>
                <matches string="@{list}" pattern="^(.+,\s*|\s*)@{value}(\s*|\s*,.+)$" casesensitive="@{casesensitive}"/>
            </or>
        </condition>
    </sequential>
</macrodef>