Регулярное выражение переименовать - PullRequest
2 голосов
/ 06 июля 2011

Я пишу скрипт Ant, который перемещает содержимое одного каталога в другой. Помимо простого перемещения файлов, мне также необходимо переименовать файлы.

Некоторые файлы имеют структуру name1_ab_cd.properties, а некоторые файлы имеют структуру name2_ab.properties. По сути, мне нужно удалить все с первого _ до конца и заменить его свойствами.

Итак, файлы должны быть названы как name1.properties и name2.properties. В настоящее время моя реализация выглядит следующим образом:

<mapper type="regexp" from="(.*)_.*_.*(.*)" to="\1.properties\2" />

Это работает для файлов с двумя _, но не для файлов с одним _. name1_ab_cd.properties будет переименован в name1.properties, однако name2_ab.properties останется без изменений. Если я сделаю это так:

<mapper type="regexp" from="(.*)_.*(.*)" to="\1.properties\2" />

тогда только name2_ab.properties будут переименованы в name2.properties, однако name1_ab_cd.properties останется без изменений.

Мне нужен способ, чтобы просто выбрать первый _ и затем выбирать до конца строки. Как мне это сделать?

Спасибо

Ответы [ 2 ]

2 голосов
/ 06 июля 2011

Попробуйте это:

<mapper type="regexp" from="([^_.]+)[^.]*(\.properties)" to="\1\2" />
0 голосов
/ 06 июля 2011

Регулярные выражения жадные. То есть они будут соответствовать максимально возможному совпадению. Представьте себе строку, подобную этой:

this_is_a_test

и я хочу первую часть с первым подчеркиванием:

this_is_a_test =~ s/^(.*)_/$1/

Набор скобок будет соответствовать не только this, но this_is_a_test, потому что это наибольшее совпадение. Это потому, что я говорю, чтобы все совпадало с подчеркиванием.

Основной способ обойти что-то подобное - исключить персонажа, которого я не хочу. Например:

this_is_a_test =~ s/^([^_]*)_/$1/

Заменяет .*, который соответствует любой серии символов, на [^ _] *, которая соответствует любой серии символов , за исключением подчеркиваний. Таким образом, вы подходите только до первого подчеркивания.

Фактически, мы могли бы удалить подчеркивание после группировки:

this_is_a_test =~ s/^([^_]*)/$1/

Итак, все, что вам нужно сделать, это изменить свой картограф с:

<mapper type="regexp" from="(.*)_.*(.*)" to="\1.properties\2" />

до

<mapper type="regexp" from="^([^_]*).*\.properties$" to="\1.properties"/>

^([^_]*) будет соответствовать всему от начала строки до первого подчеркивания. \.properties$ убедится, что имя файла оканчивается на .properties.

Я не уверен, чем занималась ваша вторая группа. (Вы пытаетесь переместить часть строки после суффикса .properties?) Вместо этого я просто сделал это, как вы указали в своем первоначальном запросе.

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