私は次のような配列を持っています:
["Rob Meyer", "Michelle Preston"]
rob or Rob, or meyer or Meyer
配列内の任意の「単語」、文字ではなく単語のみ、大文字と小文字を区別しないなどの出現を検索したい。
では、どうすればいいですか?include?
完全一致を探します。ここでもっと柔軟なものを探しています。
私は次のような配列を持っています:
["Rob Meyer", "Michelle Preston"]
rob or Rob, or meyer or Meyer
配列内の任意の「単語」、文字ではなく単語のみ、大文字と小文字を区別しないなどの出現を検索したい。
では、どうすればいいですか?include?
完全一致を探します。ここでもっと柔軟なものを探しています。
それはあなたが探しているものですか?
query = 'rob'
["Rob Meyer", "Michelle Preston"].any?{|e| e =~ /\b#{query}\b/i}
単語のリストをプリコンパイルします。
words = ["Rob Meyer", "Michelle Preston"].flat_map{|s| s.downcase.scan(/\w+/)}
words.include?("Rob".downcase) # => true
私はこの種のことをよくします:
names = ["Rob Meyer", "Michelle Preston"]
targets = %w[rob meyer]
regex = /\b(?:#{ Regexp.union(targets).source })\b/i
# => /\b(?:rob|meyer)\b/i
names.select{ |name| name[regex] }
ヒットした名前の配列を返します。
[ [0] "ロブ・メイヤー" ]
私が使用する理由Regexp.union
は、可能性のあるターゲットの膨大なリストを取得し、それらを検索するためのパターンを即座に作成し、何メガバイトものテキストからヒットを検索するのは簡単だからです。すべて正規表現エンジンの速度で、反復なしで実行されます。これは、Ruby で検索できる速度とほぼ同じです。
name[regex]
true/false 値を生成するための基礎です。に変更すると!!name[regex]
、真/偽のブール値が返されます。
ヒットで名前を取得する に埋め込む代わりにselect
、条件付きのループ内で実行できます。
names.each do |name|
if name[regex]
puts "got a hit for '#{ name }'"
end
end
どの出力:
got a hit for 'Rob Meyer'
マッチ操作を探しているようです。Ruby では正規表現 (regex) を使用できます。
match()メソッドを読めば、必要なものがきっと見つかるはずです。
Ruby で正規表現を使用する場合、式の後に "/i" を付けると、大文字と小文字が区別されなくなります。
私は通常、http://ruby-doc.org/にアクセスして、Ruby 言語の仕様を見つけます。
幸運を!