我想获得2个字符串数组的交集。第一个数组有不同的大小写。我想要的结果数组应该尊重第一个数组的外壳,但是2之间的比较应该忽略大小写。 E.g。
^\+(?:[\d]{2})$
结果应为:
letters = ['Aaa', 'BbB', 'CCC']
permitted = ['aaa', 'bbb']
我在做:
['Aaa', 'BbB']
但这会返回letters.map(&:downcase) & permitted.map(&:downcase)
这样做的好方法是什么?更长的方法是:
['aaa', 'bbb']
但是有更短/更整洁的方式吗?
答案 0 :(得分:3)
您可以使用select
:
search = permitted.map(&:downcase)
letters.select{|letter|
search.include?(letter.downcase)
}
甚至更整洁(imho):
-> search {
letters.select{|x| search.include?(x.downcase)}
}.call(permitted.map(&:downcase))
答案 1 :(得分:2)
有一种以不区分大小写的方式比较字符串的方法,String#casecmp
:
letters = ['Aaa', 'BbB', 'CCC']
permitted = ['aaa', 'bbb']
letters.select{|l| permitted.detect{|p| p.casecmp(l) == 0 } } # => ["Aaa", "BbB"]
您也可以use regular expressions。 :)
letters = ['Aaa', 'BbB', 'CCC']
permitted = ['aaa', 'bbb']
letters.grep(Regexp.new(permitted.join('|'), Regexp::IGNORECASE)) # => ["Aaa", "BbB"]