rails 独学して軽くにちゃんまとめつくる

インターン中大学生のブログ

ぐるぐる回って何をしたいのかが変わってく。今はマッチングサイトを作りたい、もしくは論文のキュレーションサイトかな。

ruby 特定の文字が含まれていない配列だけとりだす

言い換えれば配列と配列の比較をしたい人のための記事だ。完全一致と部分一致で比較したい人が見るべき。

配列は結局は文字の集まりだから、文字同士の比較と考えよう。

禁止ワードを取り除くとでもいうのか。rubyクローラーで取り合えずデータ収集したのだが、邪魔なワードが含まれているものははじきたかったので調べてみた。

どらえもんのキャラで例える。

ary = [["のびた", "野比家の子供"], ["スネ夫", "金持ちのボンボン"], 
        ["ジャイアン", "雑貨屋の息子"], ["静香", "中流階級"], ["どらえもん", "居候"]]

という多次元配列があるとする。これで「のびた」と「どらえもん」だけを除いた配列がほしいときはinclude? メソッドと、邪魔なワードの配列をつくればいい。

ary = [["のびた", "野比家の子供"], ["スネ夫", "金持ちのボンボン"], 
        ["ジャイアン", "雑貨屋の息子"], ["静香", "中流階級"], ["どらえもん", "居候"]]
damenahito = ["のびた", "どらえもん"]

ary.each do |hito|
  p hito unless damenahito.include?(hito[0])
end

############
$ ruby sample.rb
["スネ夫", "金持ちのボンボン"]
["ジャイアン", "雑貨屋の息子"]
["静香", "中流階級"]

となり、のびたとどらえもんのいない配列を取得することができた。ここでは配列と文字の比較をしたのだ。

ary.include?(string)

(配列).include? (文字) 

とすることで、文字を配列にある禁止ワードリストと比較してくれる。存在すれば true でなければ false をかえしてくれる。

配列の2つめのように、文章を検索して禁止ワードと中間一致しているのも検出したい場合を考える。やることは同じで、上のコードをもう少し拡張する。

こうすればいい

ary = [["のびた", "野比家の子供"], ["スネ夫", "金持ちのボンボン"], 
        ["ジャイアン", "雑貨屋の息子"], ["静香", "中流階級"], ["どらえもん", "青い居候"]]
damekeyword = ["ボンボン", "居候"]


ary.each do |hito|
  damekeyword.each do |dame|
   p hito if  hito[1].include?(dame)
  end
end

###############

 $ ruby sample.rb
["スネ夫", "金持ちのボンボン"]
["ジャイアン", "雑貨屋の息子"]
["静香", "中流階級"]
------------------
["スネ夫", "金持ちのボンボン"]
["どらえもん", "青い居候"]

「ボンボン」「居候」という文字が含まれているものだけを検出したいときはこうする。ary と damekeyword の両方に対して each をするのは配列をバラバラにして文字同士の比較にまで次元を落とすためである。最初のは配列と文字の比較だったが、どうやらその場合は完全一致にするひつようがあり中間一致はうまくいかなかったのだ。

文字の検索(中間一致)

str1.include?(str2)
(文字1).include?(文字2)


※ただし中間一致なのだから(文字1)に長いほうの文字を、(文字2)にキーワードを入れよう

これで終わり。おつかれさん。