Ruby 缺少 Perl 拥有的一个非常有用的模块,称为 Regexp::Assemble。 Ruby 的 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 的更多信息,请参阅“Is there an efficient way to perform hundreds of text substitutions in Ruby?”。