2011-12-21 2 views
-3

Поэтому я подрезки путь, который выглядит следующим образом:Perl обрезать путь Regex

E:\folder\00000000\file.txt 

Я хочу, чтобы заменить это:

E:\folder\ 

И я не могу придумать регулярное выражение, чтобы сделать это.

Я спрашивал об этом раньше, но получил заказ.

+1

вы можете предоставить более подробную информацию? Все ли ваши пути имеют одинаковый формат? Какую часть пути вы хотите захватить с помощью регулярного выражения? – imaximchuk

+1

Возможный дубликат [Корректировка регекса до последней папки и файла] (http://stackoverflow.com/questions/8592751/regex-trim-path-to-last-folder-and-file) ** Обновите исходный вопрос с помощью соответствующая информация. ** –

ответ

2

предполагая имена переменного диска и папки только подчеркивает/дефис:

/^[A-Z]:\\(\w|_|-)+\\/ 

будет соответствовать E:\folder\

+0

Это сработало! Как только это позволит мне, я буду отмечать это правильно! Спасибо! –

1

Используйте это регулярное выражение ^(.*[\\/])([^\\/]+[\\/][^\\/]+)$

$1 будет равен E:\folder\ и $2 будет равным 00000000\file.txt

+1

Обратите внимание, что имена путей Windows * могут * содержать символ '/', поэтому использование '[\\\ /]' является более параноидальным способом обработки разделителей. – BRFennPocock

+0

спасибо за предложения, я обновил ответ – imaximchuk

5

Манипулирование путей с регулярным выражением сосет.

use Path::Class::File qw(); 
my $path = Path::Class::File->new_foreign('Win32', 'E:\\folder\\00000000\\file.txt'); 
# E:\folder\00000000\file.txt 
my $base = $path->parent->parent; 
# E:\folder 
+0

Что заставляет вас думать, что иностранный нужен здесь? Но что более важно, вопрос заключался не в том, как извлечь папку E: \, но и подставить его. – ikegami

+0

Использование простого экспортированного конструктора 'file' и вызова родителя на нем заставляло меня думать, оно возвращает' .', но прямо говорит, что это путь DOS-ish всегда работает. - Я виню неясную формулировку в вопросе. Если бы я мог, я бы передал ваши ответы. – daxim

+0

Нет, 'say Path :: Class :: File-> new_foreign ('Win32', 'file.txt') -> parent' возвращает' .' тоже. – ikegami

1
use Path::Class qw(file dir); 

my $file  = file('E:\\folder\\00000000\\file.txt'); 
my $orig_base = dir('E:\\folder'); 
my $new_base = dir('F:\\directory'); 

# F:\directory\00000000\file.txt 
say $file->relative($orig_base)->absolute($new_base);