2014-11-22 154 views
3

给定用正斜杠('/')定义的正则表达式的散列,我想测试一个字符串是否与它们中的任何一个匹配。如何从非大小写不敏感的Regexp创建不区分大小写的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 

但同样,这不能识别字符串的任何部分。

那么,如何从不区分大小写的正则表达式创建区分大小写正则表达式?

+0

如果在模式的末尾添加'i'确实有效,那么你究竟在做什么? – hwnd 2014-11-22 22:56:50

+0

一个通用的词法分析器,我可以提出一个不区分大小写的选项 – JCLL 2014-11-22 23:16:20

+0

当用户想要使用词法分析器而不区分大小写时,为什么不使用'i'选项?任何其他解决方案都在重塑车轮。 – 2014-11-23 04:50:48

回答

3

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

original = /abc/ 
insensitive = Regexp.new(
       original.source, 
       original.options | Regexp::IGNORECASE) 

进行匹配不区分大小写不使用“忽略大小写”选项,一个可能的解决方案是创建一个正则表达式

original = /abc/ 
insensitive = /[Aa][Bb][Cc]/ 

如果你原来的正则表达式的所有字母作为你的例子,你可以自动完成这样的:

大写字母和小写字母像这样的比赛

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

+1

为什么当我们有['Regexp#source'](http://ruby-doc.org/core-2.1.5/Regexp.html#method-i-source)解析'inspect'? – 2014-11-23 00:56:03

+0

@mu你说得对,好主意,我现在编辑。 – joelparkerhenderson 2014-11-23 04:34:36