Почему мой Perl регулярное выражение удаляет. перед расширением файла? - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть это регулярное выражение:

$f =~ s/[.\W_]//g;

, которое содержит только цифры, буквы и.в имени файла (filename.ext).

Но он не сохраняет . (точку) перед расширением файла.Поэтому, если у меня есть:

my $f = "prn-the_rush show.jpg"

Результат равен prntherushshowjpg, но . отсутствует!

Я хочу prntherushshow.jpg как результат.

Как мне это сделать?

Ответы [ 4 ]

7 голосов
/ 03 апреля 2012

Перепишите класс символов, чтобы он явно соответствовал тому, что вы хотите сохранить:

$f =~ s/[^A-Za-z0-9.]//g;

Вы также можете сделать то же самое более эффективно, используя tr/// (a.k.a. y///):

$f =~ tr/A-Za-z0-9.//cd;
2 голосов
/ 03 апреля 2012

Многие люди уже дали вам регулярные выражения, которые работают для вашей проблемы.Однако, когда я сталкиваюсь с этими случаями, я часто заканчиваю тем, что отделяю имя файла от расширения, чтобы я мог поиграть с именем файла отдельно:

my( $name, $extension ) = $filename =~ /(.+)\.([^.]+)\z/;
$name =~ s/.../.../;
my $new_filename = join '.', $name, $extension;

Я часто хотел rsplit для такого родачто бы я мог разбить его на ограниченное количество элементов, начиная справа:

my( $name, $extension ) = rsplit /\./, $filename, 2;   # fake code

Когда вы делаете это таким образом, если вы решите удалить . из части вашего имени файла, вы не 'чтобы защитить финал . перед расширением, нужно играть с трюками с регулярным выражением.

2 голосов
/ 03 апреля 2012

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

$f =~ s/[^a-zA-Z0-9\.]//g;
1 голос
/ 03 апреля 2012

Сценарий:

#!/usr/bin/perl
use strict;

my $f = "prn-the_rush show.jpg ";
   $f =~ s/[^a-z\d\.]//ig;

print "$f\n";

Выход:

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