質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

1296閲覧

rubyで文字列の中に含まれる正規表現を抽出する

lovetelevi

総合スコア5

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

1グッド

1クリップ

投稿2020/02/19 11:28

編集2020/02/19 11:52

前提・実現したいこと

ログの中からGoogle botのipを数えたいです。
複雑な文字列からrubyのstring#includeを用いて、google botかどうか判定させたいです。

以下が対象の文字列です。

str= "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.120 Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

↑の文字列の中のChrome/の後ろのipが可変なので(79.0.3945.120の部分)、それに対応する正規表現を挿れたいのですが、それは可能なのでしょうか?

実現したいこと

以下のような具合で文字列の中で正規表現を挿れたいです。

str.include?("Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/#{ipの正規表現にしたい} Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) ")

変数展開の中身を正規表現にさせて
この場合にはtrueを返したいです。

試したこと

require 'resolv' ip_rege = Resolv::IPv4::Regex

として、#{ ip_rege} と文字列の中に挿入したのですが、うまくいかないので、困って質問させていただきました。
大変お手数おかけしますが、参考にさせていただけましたら幸いです。

補足情報(FW/ツールのバージョンなど)

ruby -v
2.6.3

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2020/02/19 22:50

> 文字列の中のChrome/の後ろのipが可変なので(79.0.3945.120の部分) そもそもIPアドレスではなくバージョン番号です。 GooglebotのUAを使っているかを判別したいのか それとも、IPアドレス(バージョン番号?)を取得したいのか、どちらなのでしょうか? 前者なのであればバージョン番号部分を気にする必要はありません。
lovetelevi

2020/02/20 00:20

スマホ、pcごとの、GooglebotのUAを使っているかを判別したいです。 バージョン番号だとはわかりませんでした。大変勉強になりました!
guest

回答1

0

ベストアンサー

判別だけしたいのならば

ruby

1str.match?(/\s?Googlebot/\d/)

だけ見ればよいかと思います。

ログの中からということなので
大量の文字列が配列として渡されていることを想定するとEnumerable#grepが便利です。

logs = ["nobot", "Googlebot/2.1", "Google"] p logs.grep(/\s?Googlebot/\d/) # => ["Googlebot/2.1"]

投稿2020/02/19 22:57

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lovetelevi

2020/02/20 00:16

ご回答ありがとうございます! 後出しで大変申し訳ないのですが、pcブラウザとスマホブラウザで分けて判別したいのです。 スマホのbotは "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/w.x.y.z", "Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" で pcのbotは "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" と "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/" の二種類のユーザーエージェントがあります。 pcはGooglebotで スマホはMobile Safari/537.36 (compatible; Googlebot/2.1 でそれぞれ分けて部分的にmatchさせれば良さそうですが、できれば表題の通り、全一致で取れると確実性が高まると思うのですが、、難しいでしょうか。
asm

2020/02/20 01:17

偽陽性・偽陰性どっちのリスクを軽視するかなのですが 確実性を高めるために最小の特徴的な文字列で判別しています。 偽陽性のリスクを重視し長い正規表現を使うのであれば %r{Mozilla/5.0 (Linux; Android 6.0.1; Nexus 5X Build/MMB29P) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/\d+.\d+.\d+.\d+ Mobile Safari/537.36 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)} となります。
lovetelevi

2020/02/21 00:16

大変勉強になりました。 ありがとうございます。 正規表現勉強しなきゃと強く感じました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問