2010-12-20 4 views
2

含まれている場合: hello, poison, world, search, echo ... をそして、私はいくつかの文字e, h, o を持っている今、私はこの手紙を含んでいるすべての単語を見つける必要があります。 e, h, o正規表現:3つの文字は、私は単語の数を持っている

ためsearch, echoと同じように、私はこの方法で検索することができます。

words = %w[hello poison world search echo] 
matched = words.select do |w| 
    %w[e,h,o].all?{ |l| w =~ /#{l}/ } 
end 

問題は文字がo, o, o、またはl, b, lをしている場合、この検索はopenまたはboilのような言葉をtrueを返すということですが、私は言葉を検索する必要があります

:すなわち o又は l二の三一の b

UPDを含みます

leters = "abc" words.select{ |w| w.count(letters) >= 3 } 

UPD 2

悪いソリューション、例:

"lllllll".count("lua") #=> 5 
+0

どのように多くの言葉あなたは全体で良好なパフォーマンスをしたい場合は? –

+0

あなたのテキストはどれくらいの大きさですか?また、それに対して複数の3文字セットを実行する必要がありますか? –

+0

約500-1000語(これは配列です)セット(毎回20-30) – fl00r

答えて

1

本当に正規表現が必要ですか?文字列はその中の値をカウントすることをサポートしています。このような何か:

words = ["pool", "tool", "troll", "lot"] 
letters = "olo" 

#find how many of each letter we need 
counts = {} 
letters.each { |v| counts[v] = letters.count(v) } 

#See if a given work matches all the counts 
# accumulated above 
res = words.select do |w| 
    counts.keys.inject(true) do |match, letter| 
     match && (w.count(letter) == counts[letter]) 
    end 
end 
+0

どうして 'words.select {| w | w.count(letters)} ' – fl00r

+0

それを入手しました。私はこのように好きです。どうも! – fl00r

1

それは、このために正規表現を使用しないでおそらく最高のですが、それは行うことができます。

すべての3つの文字異なる:

/^(?=.*a)(?=.*b).*c/ 

二つの同じ及び異なるもの:

/^(?=.*a.*a).*b/ 

すべての3つの同一の(それは各チェックで小さくなるように)

/^.*a.*a.*a/ 
+0

正規表現を使わずにこれを解決するにはどうすればよいですか? – fl00r

+0

@floor:あなたのターゲット3文字中の各文字の頻度を数え、それからそれぞれの文字について、あなたがテストしている単語で少なくともその回数だけ発生していることを確認します。 –

1

単語を修正することを検討してください。

words = %w(fooo for find o ooo) 
matched = words.select do |orig| 
    # note: str.gsub! returns nil if nothing was replaced 
    w = orig.clone 
    %w(o o o).all?{ |l| w.gsub!(/^(.*)(#{l})(.*)$/, '\1\3') } 
end 
0

はクレイジーに見えるが、それは動作します:

leters = "abc" 
words.select{ |w| w.count(letters) >= 3 } 

しかし、それはキリル文字:(では動作していない

+0

一般化された: 'words.select {| w | w.count(letters)> = letters.size} ' –

+1

ひとつ深刻な問題:' 'lllll ''。count(alo)#=> 5' :( – fl00r

+0

'jcount'で固定されたキリル文字 – fl00r

関連する問題