В Ruby отсутствует действительно полезный модуль, который есть в Perl, который называется Regexp :: Assemble. Ruby's Regexp :: Union не находится рядом Вот как использовать Regexp :: Assemble и его результат:
use Regexp::Assemble;
my @extensions = sort qw(flv swf png jpg gif asx zip rar tar 7z gz jar js css dtd xsd ico raw mp3 mp4 wav wmv ape aac ac3 wma aiff mpg mpeg avi mov ogg mkv mka asx asf mp2 m1v m3u f4v pdf doc xls ppt pps bin exe rss xml);
my $ra = Regexp::Assemble->new;
$ra->add(@extensions);
print $ra->re, "\n";
Какие выходы:
(?-xism:(?:m(?:p(?:[234]|e?g)|[1o]v|k[av]|3u)|a(?:s[fx]|iff|ac|c3|pe|vi)|p(?:p[st]|df|ng)|r(?:a[rw]|ss)|w(?:m[av]|av)|x(?:ls|ml|sd)|j(?:ar|pg|s)|d(?:oc|td)|g(?:if|z)|f[4l]v|bin|css|exe|ico|ogg|swf|tar|zip|7z))
Perl поддерживает флаг s
, а Ruby - нет, поэтому его нужно убрать из ?-xism
, и мы хотим игнорировать регистр символов, поэтому необходимо переместить i
, в результате чего ?i-xm
.
Включите это в скрипт Ruby как регулярное выражение:
REGEX = /(?i-xm:(?:m(?:p(?:[234]|e?g)|[1o]v|k[av]|3u)|a(?:s[fx]|iff|ac|c3|pe|vi)|p(?:p[st]|df|ng)|r(?:a[rw]|ss)|w(?:m[av]|av)|x(?:ls|ml|sd)|j(?:ar|pg|s)|d(?:oc|td)|g(?:if|z)|f[4l]v|bin|css|exe|ico|ogg|swf|tar|zip|7z))/
@url = URI.parse(url)
puts @url.path[REGEX]
uri = URI.parse('http://foo.com/bar.jpg')
uri.path # => "/bar.jpg"
uri.path[REGEX] # => "jpg"
См. " Существует ли эффективный способ выполнения сотен подстановок текста в Ruby? " для получения дополнительной информации об использовании Regexp :: Assemble из Ruby.