はじめに
今回は正規表現(基本編)のお話です
正規表現を初めに見たときは、"/\d+\/\/"みたいなのを見てなんだこれは、謎の記号の羅列やんと思ったものです
ですが、私もプログラミング学習を進めていくうちに、少しずつわかってくるようになったので、このタイミングで書きたいと思います
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです
目次
- 正規表現の各パーツについて
- 正規表現でなんか取ってこよう
正規表現の各パーツについて
まずは謎の記号の羅列が、各パーツに分解できるところから知りましょう(今回は解説含むので、理解できているものを紹介します)
[abc] #aかbかcのどれか1文字
[^abc] #a,b,c以外の1文字
[a-z] #a~zのうちのどれか1文字
[a-zA-Z] #a~zかA~Zのうちのどれか1文字
. #任意の1文字
\d #任意の数字
\w #任意(文字、数字、アンダースコアのうちの)の1文字
(a|b) #aかbどちらか
a? #a("?"の直前の文字)が0回か1回か
a+ #a("+"の直前の文字)が1回以上
a{3} #aが3回
\/ #\の使い方、"/"を文字として扱う
基本的なところはこんなところでしょうか
これを組み合わせることで正規表現が成り立っています
最初に述べた"\d+"は"\d"と"+"の組み合わせですね
つまるところ、任意の数字が1回以上、ということになります
正規表現でなんか取ってこよう
以前記事で書いた"scan"メソッドでも使って、文字列の中から任意の文字列を取り出してきましょうか
URLを取り出してみる
URLを取り出してみましょう
例えばこんな文章があるとします
私のQiitaのMYPageはhttps://qiita.com/Ikuy_hです
これからURLを取り出したいと思います
ただし、この一文にしかヒットしないのは汎用性が全くないので、汎用性のあるコードにしたいと思います
まず、URLの頭ですが、"http:"か"https:"のどちらかから始まっている(それしか知りません、間違ってたら教えてください)ので、まずはそこにマッチするかを記述してみましょう
https?:
できました
次に"/"です
前述したように、"/"を文字として考えなくてはいけませんので、こうなります
https?:\/\/
できました
次は何かしらの文字が来るはずです
その記述を行います
まずは文字が入っているかどうかと、文字が一回以上でるということを考えて記述してみます
https?:\/\/[\w]+
できました
前述した基本パーツの組み合わせです
[]はどれか[]内のどれか1文字でしたよね
\wは任意(文字、数字、アンダースコアのうちの)の1文字でしたよね
+はそれが1回以上出現するかどうかですね
しかし、これではまだ不十分です
だって…
"."があるじゃないか!!
そうです、\wでは"."は補完されません
あと記号としては"-","?","%","&","=","/"が考えられそうですね
なので…
https?:\/\/[\w\.\-?%&=\/]+
できました
()を使ったグループ化をする方がもっと綺麗にかけそうですが、まだ使いこなせていないので、今はこれでご勘弁を
ちゃんと理解したら、その時また記事書きます
さあ、では実際に、プログラミングしてみましょう
hp = "私のQiitaのMYPageはhttps://qiita.com/Ikuy_hです"
p hp.scan(/https?:\/\/[\w\.\-?%&=\/]+/)
# => ["https://qiita.com/Ikuy_h"]
取り出せましたね
さいごに
プログラミングというか、ものづくりあるあると言いますか、出来上がりを無知な状態で見ると「うわぁ…こんなん…」って思いがちですが、一つずつ理解していくとほとんどのケースで分解ができます
分解して考えるとより理解しやすくなりますね