如何使用grep过滤某些字符数组?
examp = [["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["foobar"], ["clamjam"]]
foo = examp.grep(/[^am]/)
p foo
这是预期的输出:
[["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["clamjam"]]
这是实际输出:
[]
我哪里出错了?
答案 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"]