Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用Regexp.union指定Regexp选项_Ruby_Regex_Syntax - Fatal编程技术网

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 })