2013-12-20 54 views
-1

如何用grep過濾某些字符數組的數組?如何使用grep過濾某些字符的數組數組?

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

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

這是預期的輸出:

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

這是實際的輸出:

[] 

我有什麼錯?

回答

2

你有一個數組數組,每個數組都不匹配正則表達式。一個正則表達式匹配一個字符串,但不是一個數組。那是你做錯了什麼。

0

如果examp是一個字符串數組,但是它是一個單元素數組數組,那麼您將會如何工作。

此外,正則表達式中的大括號[]代表字符類,而在正則表達式之外它分隔紅寶石數組。第一個與後者不匹配。

相反,做

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

另外,如果你只想要字符串數組,你可以做

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

爲什麼您的解決方案包含'foobar'?這恰恰是沒有我的唯一陣列; foob​​ar是我試圖擺脫的那個。 – user3116998

+0

@ user3116998在這種情況下,您需要'/ am /'作爲正則表達式。更新。 – Matt

0

另一種可能是:

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

結果:

[["ram"], ["bam"], ["mam"], ["jammy"], ["grammy"], ["clamjam"]] 
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可以使用,但不是你如何做到的。

如果你想找到包含子串子陣中的元素:使用grep

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

這可能已經完成:

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

如果你想獲得擺脫了空子陣列:

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

flatten如果西澳結果nt擺脫子陣列:

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