Perl регулярное выражение сопоставления альтернативных имен файлов - PullRequest
2 голосов
/ 17 апреля 2019

Пример:

Раньше я использовал regex, чтобы получить расширение от имени файла:

my $name = "file.zip";
my ($fname, $fext) = $name =~ /(.*)\.(.*)/;

# file
# zip

Теперь мне нужно убедиться, что он также правильно перехватывает .tar.gz файлы,если имя включает его, в противном случае возвращается к примеру выше.Я сделал следующее:

my $name = "file.tar.gz";
my ($fname, $fext) = $name =~ /(.*)\.(tar\.gz$)|(.*)\.(.*)/;

# file
# tar.gz

Проблема:

Проблема в том, что теперь он работает только для file.tar.gz и не отступает от перехвата обычных файлов, таких как file.zip,и возвращает пустой, во втором случае.

Как мне сделать это в одном регулярном выражении, чтобы он успешно работал для file.tar.gz и file.zip.Что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 17 апреля 2019

Вы можете использовать

/^(.*?)\.(tar\.gz|[^.]*)$/

Детали

  • ^ - начало строки
  • (.*?) - Группа 1: любые 0+ символов, кроме символов разрыва строки, как можно меньше
  • \. - точка
  • (tar\.gz|[^.]*) - группа 2: tar.gz или любые 0+ символов, кроме точки
  • $ - конец строки.

См. Демоверсию regex .

В качестве альтернативы, вы также можете использовать свой оригинальный шаблон, но оберните его группой сброса ветвей :

/(?|(.*)\.(tar\.gz)|(.*)\.(.*))$/

См. это демо регулярных выражений . Он назначит одинаковые идентификаторы соответствующим группам захвата внутри группы сброса ветви. Поскольку сначала будет пробоваться (.*)\.(tar\.gz), если есть строка, заканчивающаяся .tar.gz, первая чередующаяся часть ((.*)\.(tar\.gz)) будет соответствовать, в противном случае вторая ((.*)\.(.*)) будет использовать строку.

0 голосов
/ 17 апреля 2019
perl -e '$name= "file.zip";($fname,$fext)=$name =~ /(.*)\.(tar\.gz|zip)$/ ;print "$fname.$fext"'
file.zip

номер захваченной группы, т.е.4, больше, чем присвоенная переменная ($fname,$fext)=, т.е.2 только первые 2 группы назначены

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