2016-10-12 7 views
2

私は文字列"rubinassociatespa"を持っていると言います。私がしたいのは、その文字列の3文字以上の部分文字列を他の文字列で検出することです。別の文字列で1文字列内の部分文字列の存在を検出するにはどうすればよいですか?

例えば、次の文字列が検出されなければならない:

  • rubin
  • associates
  • spa
  • ass
  • rub

しかし、何が検出されない必要があることは、以下の文字列です:

  • rob
  • cpa
  • dea
  • ru や私の元の文字列に表示されない任意の他の部分文字列、または短いです3文字以上

基本的に、私は文字列を持っていますが、他の多くの文字列と比較しています。元の文字列の部分文字列を構成する文字列と一致したいだけです。

私はそれがはっきりしていることを望みます。 test_strstrのストリングがある場合

答えて

4
str = "rubinassociatespa" 

arr = %w| rubin associates spa ass rub rob cpa dea ru | 
    #=> ["rubin", "associates", "spa", "ass", "rub", "rob", "cpa", "dea", "ru"] 

ちょうどString#include?を使用してください。

def substring?(str, s) 
    (s.size >= 3) ? str.include?(s) : false 
end 

arr.each { |s| puts "#{s}: #{substring? str, s}" } 
    # rubin: true 
    # associates: true 
    # spa: true 
    # ass: true 
    # rub: true 
    # rob: false 
    # cpa: false 
    # dea: false 
    # ru: false 
+0

これは素晴らしい答えですが、もしあなたがマッチの配列を返そうとするなら、 'select'を以下のように使うことができます:' arr.select {| s | substring?(str、s)} ' –

+0

各文字列を正規表現に変換する利点は何ですか? – Stefan

+1

@Stefan、利点はありません。なぜ聞くのですか? ¯\\ _(ツ)_ /¯ –

2

あなたは、そうmatch

str = "rubinassociatespa" 

test_str = "associates" 

str.match(test_str) #=> #<MatchData "associates"> 
str.match(test_str).to_s #=> "associates" 

test_str = 'rob' 

str.match(test_str) #=> nil 

使用することができ、その後、match方法はそれ以外の場合は、nilを返します、全体test_str戻ります。

if test_str.length >= 3 && str.match(test_str) 
    # do stuff here. 
end 
+0

'match'は引数を正規表現として扱います。普通の文字列の場合、 'include?'で十分です。 – Stefan

1

まず、受け入れ可能な文字列のリストが必要です。 https://github.com/first20hours/google-10000-englishのようなものはおそらく便利だろう。

第2に、単語が有効かどうかを高速検索で確認できるデータ構造が必要です。私はこれにBloom Filterを使用します。 https://github.com/igrigorik/bloomfilter-rb

次に、有効な単語リスト内のすべての有効な単語のリストを使用してBloomフィルタを開始する必要がある場合、この宝石は役に立つかもしれません。

次に、文字列内の各部分文字列に対して、有効な単語リストに含まれているかどうかを調べるために、ブルームフィルタ構造を検索します。 What is the best way to split a string to get all the substrings by Ruby?

ブルームフィルタがtrueを返す場合は、ブルームフィルタが確率的なデータ構造であるため、実際にリストに含まれていることを確認する必要があります。データベースを使用して有効な単語リストコレクションを格納する必要があるため、有効かどうかを確認するためにデータベース検索を行うだけです。

今後の進め方についてお聞きしたいと思います。

関連する問題