Как извлечь первый элемент в списке, используя replaceregex в файле Ant? - PullRequest
1 голос
/ 28 марта 2009

Работа с системой регулярных выражений Ant, кажется, не дает мне никаких проблем. Имея достаточно работы, я обычно могу заставить ее работать (и понять, что я делал неправильно раньше). Но не в этот раз. У меня есть простая цель, в которой я хочу извлечь первый элемент из свойства, которое содержит одно или несколько слов, разделенных запятыми, например:

tgt.list.full=word1,word2,word3,word4

(Правка: tgt.list.full фактически заполняется другим свойством: tgt.list.basic, поэтому фактический файл cfg.list.file выглядит так:

tgt.list.basic=word1,word2,word3,word4
tgt.list.full=${tgt.list.basic}

)

Я хочу, чтобы первое слово: "word1" заменило свойство $ {target}. Вот как выглядит моя задача:

 <target name="load-configuration-list">
     <loadproperties srcfile="${cfg.list.file}">
         <filterchain>
             <containsregex pattern="^tgt.list.full=(.*),?.*" replace="target=\1" />
             <concatfilter prepend="${cfg.list.file}" />
         </filterchain>
     </loadproperties>
     <echo message="TGT: ${target}, FULL: ${tgt.list.full}"/>
     <fail unless="target" message="A target cannot be determined"/>
 </target>

В текущей версии, которую я перечислил под задачей «containsregex», $ {target} заполняется полным списком («word1, word2, word3, word4»), а не просто «word1». Я испробовал большое количество вариантов их. Вот пример:

<containsregex pattern="^tgt.list.full=(word1),?.*" replace="target=\1" />

Я ожидаю, что это, по крайней мере, FORCE заполняет целевое свойство, но в этом случае $ {target} остается неопределенным (даже полный список не вставляется в него).

Возможно, в моей логике цепочки фильтров есть изъян. Я знаю, что мог бы написать свою задачу, но в Ant , кажется, уже есть нужные мне компоненты, если я смогу лучше понять их.

Чтобы перефразировать мой первоначальный вопрос: учитывая разделенный запятыми список в свойстве Ant, как я могу использовать задачу Ant (не обязательно даже с использованиемrerexx или replaceregex) для извлечения первого элемента?

1 Ответ

2 голосов
/ 28 марта 2009

Будет ли это регулярное выражение лучше соответствовать тому, что вам нужно?

^tgt.list.full=([^,]+),?.*
^tgt.list.full=([^,]+),?[^\r\n]*$

Поскольку '.' (точка) представляет любой символ, '(.*),?.*' выбирает word1, word2, ... из-за жадности квантификатора *.
Может быть, '(.*?),?.*' было бы лучше, но, по крайней мере, с [^,]+ мы знаем, что жадный оператор не будет захватывать никакие ','.

Вторая форма может понадобиться, чтобы быть уверенной, что она захватывает только то, что находится на одной строке, а не "все, что следует за ," (включая следующие строки, поскольку "." В режим dotall, может включать символы crlf).


Как упомянуто Адамом в комментариях:

Пропеллер "target" фактически населялся "${tgt.list.basic},", а не "full".
Таким образом, после того, как все решено, цель была заполнена основным списком.
Я переместил полный список из файла cfg для последующего заполнения базовым списком (вместо немедленного)

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