Java csv匹配中的蚂蚁元素
我需要编写一个正则表达式来匹配逗号分隔列表中的元素,忽略Java csv匹配中的蚂蚁元素,java,regex,ant,Java,Regex,Ant,我需要编写一个正则表达式来匹配逗号分隔列表中的元素,忽略,附近的空格。 例如: elem1、elem2、elem3、elem4、elem5、elem6 以下任一项:elem1elem2elem3elem4elem5elem6应匹配 不允许使用尾随逗号(在行尾之前) 我尝试了这种模式: pattern=“(^ |/,)\s*@{value}\s*(/,|$)” 但它不起作用。(假阴性) 我怎样才能做到这一点?我怎么了 谢谢。从上一个问题中,您想测试csv列表是否包含特殊值。这是一项不同的任务,也是
,
附近的空格。
例如:
elem1、elem2、elem3、elem4、elem5、elem6
以下任一项:elem1
elem2
elem3
elem4
elem5
elem6应匹配
不允许使用尾随逗号(在行尾之前)
我尝试了这种模式:pattern=“(^ |/,)\s*@{value}\s*(/,|$)”
但它不起作用。(假阴性) 我怎样才能做到这一点?我怎么了
谢谢。从上一个问题中,您想测试csv列表是否包含特殊值。这是一项不同的任务,也是一项不同的ant任务:
<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
)插值是您的问题。而且,你不能在两边都消费,你只能在一边消费
编辑-也就是说,如果您是在全局范围内搜索,则不能在两侧使用逗号。例如,如果你想找到所有的东西。如果只是找到第一个匹配项,那么两边用逗号就可以了。我不知道java,但是,你不能仅仅把一个列表放到一个正则表达式中,并期望它匹配,除非首先将它设置为一个替代项。像“(?:^ |,)\\s*(?:elem4 | elem6)\\s*(?=,| \$)”
。当然,您需要在空格\\s
上进行另一次转义
$value = '(elem.)';
$rx = "(?:^|,)\\s*$value\\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'
我找到了一个解决方案:
图案为:
^(.+,\s*|\s*)@{value}(\s*|\s*,.+)$
一个使用示例是:
问题是,如果我作为元素python
传递,并且在列表中有pythonic
而不是python
条件匹配,我不希望这样。我只需要精确的元素匹配,我不知道。xml不会在dbl引号之间插入,因此不需要\\s
。但你的接收将允许“值”。为什么(^ |,)\s*{value}\s*(,|$)
或(^ |,)\s*{value}\s*(?=,|$)
不起作用?
^(.+,\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>