红宝石缺乏一个Perl有一个真正有用的模块,称为正则表达式::组装。 Ruby的Regexp :: Union远不及它。以下是如何使用正则表达式::组装,其结果是:
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"
请参阅“Is there an efficient way to perform hundreds of text substitutions in Ruby?”了解有关使用正则表达式::从红宝石装配。