ANT элемент в сопоставлении CSV - PullRequest
0 голосов
/ 17 февраля 2011

Мне нужно написать регулярное выражение для соответствия элементу в списке через запятую, игнорируя пробелы около ,.Например: elem1, elem2 ,elem3, elem4 ,elem5 ,elem6

Любое из: elem1 elem2 elem3 elem4 elem5 elem6 должно совпадать.

Завершающая запятая (до конца строки) не допускается.

Я пробовал этот шаблон:
pattern="(^|/,)\s*@{value}\s*(/,|$)"
, но он не работает.(Неверно отрицательный)

Как я могу сделать этот шаблон?Что у меня не так?

Спасибо.

Ответы [ 3 ]

1 голос
/ 17 февраля 2011

Интерполяция это ваша проблема.И вы не можете использовать ',' с обеих сторон, вы можете использовать только одну сторону.

Редактировать - То есть, если вы ищете в глобальном смысле, тоВы не можете использовать запятую с обеих сторон.Например, если вы хотите найти ВСЕ что-то.Если только найти первое совпадение, то запятая с обеих сторон в порядке.Я не знаю, что такое 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'

0 голосов
/ 21 февраля 2011

Я нашел одно решение:

Узор :

^(.+,\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>
0 голосов
/ 17 февраля 2011

Исходя из вашего предыдущего вопроса, вы хотите проверить, содержит ли список 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)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...