Ruby 如何使用Regexp.union指定Regexp选项
在“”中,建议使用以下代码:Ruby 如何使用Regexp.union指定Regexp选项,ruby,regex,syntax,Ruby,Regex,Syntax,在“”中,建议使用以下代码: require 'uri' #... schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i #... 我尝试将其改进为: schemes_regex = Regexp.union(URI.scheme_list.keys) 但是我不知道应该如何指定IGNORECASE选项(I)。我认为不可能像那样将选项参数传递给Regexp.union。当然,您可以在联合操作后指定它们: require 'uri
require 'uri'
#...
schemes_regex = /^(?:#{ URI.scheme_list.keys.join('|') })/i
#...
我尝试将其改进为:
schemes_regex = Regexp.union(URI.scheme_list.keys)
但是我不知道应该如何指定
IGNORECASE
选项(I
)。我认为不可能像那样将选项参数传递给Regexp.union
。当然,您可以在联合操作后指定它们:
require 'uri'
Regexp.new(Regexp.union(URI.scheme_list.keys).source, Regexp::IGNORECASE)
# => /FTP|HTTP|HTTPS|LDAP|LDAPS|MAILTO/i
与sawa的回答相同,但它希望scheme位于字符串的开头:
Regexp.union(*URI.scheme_list.keys.map {|s| /\A#{s}/i })
既然我写了那个代码。。。我使用插值方法的原因是为了简化不区分大小写的正则表达式的制作。Ruby的
Regex.union
需要允许更大的灵活性,比如正常的Regex常量,比如IGNORECASE
,但由于它没有,我选择了插值。我以前使用过这个,但就我而言,它会产生一些代码味道,因为我们创建了一个Regexp对象,然后将其转换为源字符串,然后将其重新编译到另一个Regexp对象中。这就是为什么我从OP的参考答案中选择了一个简单的连接(“|”)
。\a
或^
在将结果正则表达式与正在测试的字符串进行比较时是一个没有意义的点。OP的问题与最初的测试需求脱节。请参阅原始问题以了解原因。(六年后…Regexp.union
将数组作为参数,因此不需要splat。回答得很好,tho。
Regexp.union(*URI.scheme_list.keys.map {|s| /\A#{s}/i })