Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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创建不区分大小写的Regexp?_Ruby_Regex - Fatal编程技术网

Ruby 如何从不区分大小写的Regexp创建不区分大小写的Regexp?

Ruby 如何从不区分大小写的Regexp创建不区分大小写的Regexp?,ruby,regex,Ruby,Regex,给定一个用正斜杠(“/”)定义的正则表达式散列,我想测试一个字符串是否与其中任何一个匹配 我的匹配应该不区分大小写,但我不想在哈希中显式使用regexp末尾的 str="ENTITY foo is END" kw={ ent: /entity/, end: /end/ } kw.each do |kw_id,rex| p rex.match(str) end 这会失败,因为rex不区分大小写(当然,只需在regexp末尾添加'i'就可以了,但这不是我想要的) 所以我修改了我的代码如

给定一个用正斜杠(
“/”
)定义的正则表达式散列,我想测试一个字符串是否与其中任何一个匹配

我的匹配应该不区分大小写,但我不想在哈希中显式使用regexp末尾的

str="ENTITY foo is END"

kw={
 ent: /entity/,
 end: /end/
}

kw.each do |kw_id,rex|
  p rex.match(str)
end
这会失败,因为
rex
不区分大小写(当然,只需在regexp末尾添加
'i'
就可以了,但这不是我想要的)

所以我修改了我的代码如下,以组成一个新的regexp:

kw.each do |kw_id,rex|
  rexi=Regexp.new(rex.to_s,true)
  p rexi.match(str)
end
但同样,这无法识别字符串的任何部分


那么,如何从不区分大小写的Regexp创建不区分大小写的Regexp呢?

要动态添加不区分大小写的“忽略大小写”选项:

original = /abc/
insensitive = Regexp.new(
                original.source, 
                original.options | Regexp::IGNORECASE)
要在不使用“忽略大小写”选项的情况下使匹配不区分大小写,一个可能的解决方案是创建一个匹配大写字母和小写字母的regexp,如下所示:

original = /abc/ 
insensitive = /[Aa][Bb][Cc]/
original = /abc/
insensitive = Regexp.new(
                original.source.gsub(/[[:alpha:]]/){ "[#{$&.upcase}#$&]" })
如果原始regexp都是字母(如示例中所示),则可以这样进行自动化:

original = /abc/ 
insensitive = /[Aa][Bb][Cc]/
original = /abc/
insensitive = Regexp.new(
                original.source.gsub(/[[:alpha:]]/){ "[#{$&.upcase}#$&]" })

如果原始regexp不仅仅是字母,那么您将需要更复杂的自动化。例如,如果原始regexp使用大括号、字符类、命名捕获等,则需要考虑这些因素的代码。(感谢霍布斯在评论中强调了这一点)

如果在模式的末尾添加
i
,那么你到底想做什么呢?一个通用词法器,我可以提出一个不区分大小写的选项当用户想要使用不区分大小写的词法器时,为什么不只是使用
i
选项?任何其他的解决方案都是重新发明轮子。既然有了它,为什么还要尝试解析
inspect