Meiryo’s blog

やってみて詰まったことを備忘録として残すブログ

苦手な正規表現に慣れるまで

正規表現て使えると便利らしいですよね。

これまでに学ぼうと思ったことは
何回かありましたがやる度に挫折。
勉強するの本当に辛いんですよこれ。

そんな堕落した奴でも嫌いな正規表現
少し慣れることができたので
なにをしたか備忘録として残しておきます。

まずはやる気が出ることを見つける

なんでこう毎回興味はあるけどやる気が出なくて挫折するのか。

今回もまたやる気が出ません。
やる気が出ない状態が続き、
また挫折しそうになったのですが
ここでふと、何故やる気が出ないのかを考えてみました。

すると、正規表現はどういうタイミングで使えるのか知らないし
自分で使おうと思える実例を見たこと無いのが
原因なんじゃないかということが判明しました。

何に使えるかわからないことを勉強するのって
めちゃくちゃ苦痛だし身につかないんすよね。

これを解消できるいい感じの解説を
しているところは無いか探してみたら
下記の記事を発見しました。
正規表現はいいぞ。 -プログラマーに捧げる正規表現のススメ-|くりーむ|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}$
これが今なら何をしているのかが読めます。
{ }はわかりませんでしたが、チートシートを読んで
何をしているか理解することができました。
やる前は理解しようともせずそっ閉じしてたので
確実に耐性は付いている気がします。

もし正規表現が苦手で見たくも触りたくもないけど
興味はある、って人は簡単なものを
ちょっとだけ触ってみることをおすすめします。