正規表現て使えると便利らしいですよね。
これまでに学ぼうと思ったことは
何回かありましたがやる度に挫折。
勉強するの本当に辛いんですよこれ。
そんな堕落した奴でも嫌いな正規表現に
少し慣れることができたので
なにをしたか備忘録として残しておきます。
まずはやる気が出ることを見つける
なんでこう毎回興味はあるけどやる気が出なくて挫折するのか。
今回もまたやる気が出ません。
やる気が出ない状態が続き、
また挫折しそうになったのですが
ここでふと、何故やる気が出ないのかを考えてみました。
すると、正規表現はどういうタイミングで使えるのか知らないし
自分で使おうと思える実例を見たこと無いのが
原因なんじゃないかということが判明しました。
何に使えるかわからないことを勉強するのって
めちゃくちゃ苦痛だし身につかないんすよね。
これを解消できるいい感じの解説を
しているところは無いか探してみたら
下記の記事を発見しました。
正規表現はいいぞ。 -プログラマーに捧げる正規表現のススメ-|くりーむ|note
ここを読んだ結果、スクレイピングの時に使うのに良さそうとことと
「もし入出力が文字列で、ある程度法則性が見いだせそうだ」と思ったら、
ぜひ正規表現のことを思い出してほしい。
という部分から正規表現を使うタイミングがわかってきました。
ちょっとやる気出てきた。
正規表現を知る
何かを学ぶとき、大体サルか猫でもわかるように
解説しているところはあるもの。
ということでサルにもわかる正規表現入門を
見て正規表現の使い方を学びました。
簡単なものから慣れていこう
サルにもわかる正規表現入門を読んでいて思ったのですが、
メタ文字を単体で使うなら苦じゃないことと、
正規表現に苦手意識を持ってる人は
単体で使うことから徐々に慣らしていかないとダメだ、
ということに気づきました。
例えばなんですけど、
@"\b(\w+?)\s\1\b"
いきなりこのような暗号見たら辛くないですか?
この暗号はMicrosoftDocsに書いてあった正規表現の例一つなんですけど
いきなりこういうのを読み解こうとしたり
作ろうとしたりするのは折れる原因なんじゃないかと思います。
簡単なものから慣れていきましょう。
SUGOIチートシート
基本的な正規表現一覧 | murashun.jp
パッと確認するのにシンプルで見やすくて
とても良いチートシート。
これとサルを見て手を動かしていきたいとおもいます。
手を動かしてみる
ここを使って色々やってみたいと思います。
※「最適ではない」とか「そんな使い方があるか!」みたいなことも
やってますがご了承ください。
RegExr: Learn, Build, & Test RegEx
先頭、末尾、完全一致
「^」は先頭が指定した文字列だとマッチします。
「Ex」で始まる単語をマッチさせてみました。
https://regexr.com/
「$」は末尾が指定した文字列だとマッチします。
「s.」で終わる単語をマッチさせてみました。
「detailsもsで終わってるだろ!」と思うかも知れませんが
detailsは「.」で終わってないのでマッチしていません。
「^」と「$」で文字列を挟むとその文字列だけマッチします。
上のExplainもマッチしそうではありますが、
上はExplain~English.までが一行とみなされてるため
マッチしないんだと思います。多分。
同じ文字の繰り返し
試すのにいい感じの単語がなかったのでsmoozyを伸ばした感じの
smoooozyで試していきます。
「*」は直前の文字が0回以上同じ場合にマッチします。
「+」は直前の文字が1回以上同じ場合にマッチします。
直前の文字(o)がないsmzyではマッチしません。
「?」は直前の文字が0回か1回同じ時にマッチします。
これだけ別物感がありますね。
いずれかの条件とグループ
「|」を使うとOR検索ができます。
「ExploreかExplain」を指定しているのでどちらもマッチしました。
「( )」を使うとグループ化ができます。
囲んだ文字列をまとめて使えるようになります。
これを使って先程と同じ文字列をマッチさせてみます。
Explで始まり「ore」または「ain」で終わる
文字列がマッチします。
指定した文字のどれか
「[ ] 」を使うと指定した文字のどれかでマッチさせることができます。
大文字と小文字のabcがあればマッチするようにしてみました。
マッチしてます。
ところで。
これA~Kとかを指定するのめんどくさいですよね
[ABCDEF・・・]てなるので
これは間にハイフンを入れることで解決します。
ハイフンを使ってみたのがこちら
大文字と小文字のAからZのアルファベットがあればマッチします。
ちゃんと&や.はマッチしてませんね。
ここまでやってみた結果
ここまでやってみた結果なのですが、
ちょっと耐性付いた気がします。
記事のまとめのために良い感じのことに寄せてるとか
そういうわけではなくほんとに。
例えばですが、よく例として出される
電話番号をマッチさせる正規表現。
^0[789]0-[0-9]{4}-[0-9]{4}$
これが今なら何をしているのかが読めます。
{ }はわかりませんでしたが、チートシートを読んで
何をしているか理解することができました。
やる前は理解しようともせずそっ閉じしてたので
確実に耐性は付いている気がします。
もし正規表現が苦手で見たくも触りたくもないけど
興味はある、って人は簡単なものを
ちょっとだけ触ってみることをおすすめします。