【问题标题】:How to create a case insensitive Regexp from a non-case insensitive Regexp?如何从不区分大小写的正则表达式创建不区分大小写的正则表达式?
【发布时间】:2014-11-22 22:50:21
【问题描述】:

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

我的匹配应该不区分大小写,但我不想在哈希中的正则表达式末尾显式使用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?

【问题讨论】:

  • 如果将i 添加到模式的末尾可以解决问题,那么您到底想在这里做什么?
  • 一个通用词法分析器,我可以在其中提出不区分大小写的选项
  • 当用户想要使用不区分大小写的词法分析器时,为什么不直接使用i 选项?任何其他解决方案都是在重新发明轮子。

标签: ruby regex


【解决方案1】:

即时添加不区分大小写的“忽略大小写”选项:

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}#$&]" })

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

【讨论】:

  • 既然我们有Regexp#source,为什么还要尝试解析inspect
猜你喜欢
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 2013-11-12
  • 2022-01-09
相关资源
最近更新 更多