我想知道让String.include?种方法忽略 case 的最佳方法是什么.目前我正在做以下工作.有什么建议吗?谢谢

a = "abcDE"
b = "CD"
result = a.downcase.include? b.downcase

编辑:

推荐答案

总结

如果你只想用数组测试一个单词,或者数组的内容经常变化,最快的答案是Aaron的:

array.any?{ |s| s.casecmp(mystr)==0 }

如果你想用一个静态数组测试很多单词,最好使用farnoy答案的变体:创建一个包含所有小写单词的数组副本,然后使用include?.(这假设您可以腾出内存来创建数组的变异副本.)

# Do this once, or each time the array changes
downcased = array.map(&:downcase)

# Test lowercase words against that array
downcased.include?( mystr.downcase )

更好的是,从你的数组中创建一个Set.

# Do this once, or each time the array changes
downcased = Set.new array.map(&:downcase)

# Test lowercase words against that array
downcased.include?( mystr.downcase )

My original answer below is a very poor performer and generally not appropriate.

基准

以下是在10万多个单词的数组中随机搜索1000个单词的基准测试,其中500个单词会被找到,500个不会.

  • "regex"文本是我在这里的答案,使用any?.
  • "casecmp"测试是Arron的答案,使用我 comments 中的any?.
  • farnoy的答案是"下行数组"测试,为1000个测试中的每一个重新创建一个新的下行array.
  • farnoy的答案是"downonce"测试,但只预先创建一次查找array.
  • "set_once"测试是在测试之前从下套管字符串数组中创建一个Set.
                user     system      total        real
regex      18.710000   0.020000  18.730000 ( 18.725266)
casecmp     5.160000   0.000000   5.160000 (  5.155496)
downarray  16.760000   0.030000  16.790000 ( 16.809063)
downonce    0.650000   0.000000   0.650000 (  0.643165)
set_once    0.040000   0.000000   0.040000 (  0.038955)

如果您可以创建一个数组的下壳副本,对其执行多次查找,farnoy的答案是最好的(假设您使用一个数组).不过,如果你能创造一个Set,那就这么做吧.

如果你愿意,examine the benchmarking code美元.


原始答案

I (originally said that I)会亲自创建一个不区分大小写的正则表达式(用于字符串文字),并使用它:

re = /\A#{Regexp.escape(str)}\z/i # Match exactly this string, no substrings
all = array.grep(re)              # Find all matching strings…
any = array.any?{ |s| s =~ re }   #  …or see if any matching string is present

使用any?可以比使用grep稍微快一些,因为它可以在找到一个匹配项后立即退出循环.

Ruby相关问答推荐

这是按引用传递/值传递的误解,导致此方法无法按预期输出吗?

Ruby:程序终止后仅写入/保存/可见的文件数据

如何返回此 OOP Ruby 代码最后一行中的变量?

如何过滤散列数组以仅获取另一个数组中的键?

Jekyll 默认安装没有 _layouts 目录

从 URL 字符串中提取主机的 Ruby 代码

为什么安全导航比在 Rails 中使用 try 更好?

Kernel#gets try 读取文件而不是标准输入

Ruby |= 赋值运算符

使用正则表达式在第一个逗号之前提取文本

在 Ubuntu 上安装 Ruby 1.9.1?

加载 RubyGems 插件时出错,openssl.bundle (LoadError)

Ruby 1.9 - 无效的多字节字符(US-ASCII)

将字符串与多个模式匹配

如何获取符号链接的目标?

Capybara:按值而不是文本 Select 选项

Ruby - 用另一个字符串替换第一次出现的子字符串

等号 ('=') 放在方法定义中的方法名称之后有什么作用?

检索/列出 Redis 数据库中的所有键/值对

如何创建一个 Gemfile?