如何使用grep过滤某些字符数组?

时间:2013-12-20 01:27:18

标签: ruby

如何使用grep过滤某些字符数组?

examp = [["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["foobar"], ["clamjam"]]

foo = examp.grep(/[^am]/)
p foo

这是预期的输出:

[["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["clamjam"]]

这是实际输出:

[]

我哪里出错了?

4 个答案:

答案 0 :(得分:2)

你有一个数组数组,每个数组都与正则表达式不匹配。正则表达式匹配字符串但不匹配数组。这就是你做错了。

答案 1 :(得分:0)

如果examp是一个字符串数组,那么你会得到什么,但它是一个单元素数组的数组。

此外,正则表达式[]在正则表达式中代表字符类,而在正则表达式之外它分隔ruby数组。第一个与后者不匹配。

相反,做

foo = examp.select { |a| a[0][/am/] }
# => [["ram"], ["bam"], ["jammy"], ["grammy"], ["foobar"], ["clamjam"]]

或者,如果您只想要字符串数组,则可以执行

foo = examp.flatten.grep(/am/)
# => ["ram", "bam", "mam", "jammy", "grammy", "clamjam"]

答案 2 :(得分:0)

另一种选择可能是:

p examp.collect{|t| t if t.first =~ /am/ }.compact

结果:

[["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["clamjam"]]

答案 3 :(得分:0)

有很多不同的方法可以给这只猫上皮,但我会从:

开始
examp = [["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["foobar"], ["clamjam"]]
examp.select{ |ary| ary.any?{ |a| a['am'] } }
# => [["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["clamjam"]]

选择其元素包含子字符串'am'的子数组。这是一个在子数组中包含多个元素的示例,以显示匹配或不匹配的内容:

examp = [%w[ram], %w[foo bam], %w[mam foo], %w[foo], %w[foo bar]]
examp.select{ |ary| ary.any?{ |a| a['am'] } }
# => [["ram"], ["foo", "bam"], ["mam", "foo"]]

请注意,执行此操作不需要正则表达式。使用String's []方法进行简单的子字符串搜索可以很好地处理任务。此外,可以使用grep,但不是如何使用它。

如果要查找包含子字符串的子数组中的元素:

examp.map{ |ary| ary.select{ |a| a['am'] } }
# => [["ram"], ["bam"], ["mam"], [], []]

这可以使用grep

完成
examp.map{ |ary| ary.grep(/am/) }
# => [["ram"], ["bam"], ["mam"], [], []]

如果你想摆脱空的子阵列:

examp.map{ |ary| ary.select{ |a| a['am'] } }.reject(&:empty?)
# => [["ram"], ["bam"], ["mam"]]

flatten结果如果你想摆脱子数组:

examp.map{ |ary| ary.select{ |a| a['am'] } }.reject(&:empty?).flatten
# => ["ram", "bam", "mam"]