给定使用正斜杠('/'
)定义的正则表达式的哈希值,我想测试一个字符串是否匹配任何字符串。
我的匹配应该不区分大小写,但我不想在哈希的regexp末尾明确地使用i
flag。
str="ENTITY foo is END"
kw={
ent: /entity/,
end: /end/
}
kw.each do |kw_id,rex|
p rex.match(str)
end
这会失败,因为rex
不是不区分大小写的(当然只是在我的正则表达式末尾添加'i'
就行了,但这不是我想要的。)
所以我修改了这样的代码,以便编写一个新的正则表达式:
kw.each do |kw_id,rex|
rexi=Regexp.new(rex.to_s,true)
p rexi.match(str)
end
但同样,这无法识别字符串的任何部分。
那么如何从非大小写不敏感的 Regexp创建不区分大小写的 Regexp?
答案 0 :(得分:3)
添加不区分大小写的"忽略大小写"即时选项:
original = /abc/
insensitive = Regexp.new(
original.source,
original.options | Regexp::IGNORECASE)
为了使匹配不区分大小写而不使用"忽略大小写"选项,一个可能的解决方案是创建一个匹配大写字母和小写字母的正则表达式,如下所示:
original = /abc/
insensitive = /[Aa][Bb][Cc]/
如果原始正则表达式是示例中的所有字母,则可以像这样自动执行:
original = /abc/
insensitive = Regexp.new(
original.source.gsub(/[[:alpha:]]/){ "[#{$&.upcase}#$&]" })
如果您的原始正则表达不仅仅是字母,那么您需要更复杂的自动化。例如,如果您的原始正则表达式使用大括号,字符类,命名捕获等,那么您需要将这些考虑在内的代码。 (感谢评论中的hobbs强调这一点)