2011-07-06 3 views
2

Я пишу скрипт Ant, который перемещает содержимое одного каталога в другой. В дополнение к простому перемещению файлов мне также нужно переименовать файлы.Regular Expression rename

Есть несколько файлов со структурой 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, однако имя2_ab.properties останется как есть. Если я делаю это так:

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

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

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

Благодаря

ответ

2

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

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

Отлично! Большое спасибо за помощь, очень ценю. – intl

0

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

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?) Вместо этого я просто сделал это, как вы указали в своем первоначальном запросе.