我需要编写一个正则表达式来匹配逗号分隔列表中的元素,忽略,
附近的空格。
例如:
elem1, elem2 ,elem3, elem4 ,elem5 ,elem6
以下任何一项:elem1
elem2
elem3
elem4
elem5
elem6
应匹配。
不允许使用尾随逗号(在行尾之前)。
我尝试了这种模式:
pattern="(^|/,)\s*@{value}\s*(/,|$)"
但它不起作用。 (假阴性)
我该怎么做?我的错了什么?
感谢。
答案 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>