娯楽開発

娯楽開発

開発は娯楽。遊び心で開発をすすめるブログ。

わかった気になりたい人のための正規表現 ~メタ文字の見分け方~

見事に3記事坊主をキメて以来久しぶりの更新になります。

今回の記事から僕の所属する開発チームの先輩方とローテーションで回しながらブログを更新していくことになりました。

経緯などはこちらの先輩の記事を参照していただけると。

nannannanan.hatenablog.com

そんなわけで僕は金曜日更新の担当になりました。

今後は(少なくとも)金曜日には記事を更新していくと思うのでよろしくお願いします。

正規表現とは

本題です。

今回は今まで直視せず避け続けてきた正規表現と向き合います。

正規表現といえば/\d{2,5}[-(]\d{1,4}[-)]\d{4}/みたいな呪文のことですが、プログラムの中でテキストデータから任意の文字列を抜き出す際に使います。

先ほど挙げた呪文では「03-****-****」や 「090-****-****」といった電話番号のような文字列を抜き出すことができます。

てなわけで今回は「正規表現を使いたい!」と思った時にだいたいこの辺り押さえとけばある程度読める/書けるんじゃね?っていうポイントをまとめておきます。他でもない未来の自分のために。

ここで書くのはほんとにポイントだけです。詳細についてはググれば山ほど出てくるので気になる人は調べてみてください。僕はこの辺りの記事を参考にしました。

qiita.com

ちなみに上の記事(全4回)の内容をすべて理解すれば今回の記事は全く読む必要がなくなるのでがっつり正規表現を勉強したい方は上記の記事を、それとなくわかった気になりたい方はこの記事を読みましょう。

正規表現を読む上で

正規表現にはメタ文字があります。メタ文字とは、普通の文字と違い正規表現としての何らかの意味を持つ文字/文字列のことです。

そもそも正規表現の文字列の中にメタ文字とそれ以外の文字が入り混じっていることが諸悪の根源ですよね。自分が初心者なのでわかるのですが、正規表現初心者の方が正規表現を読めないのは

  • メタ文字を見分けることができない
  • メタ文字の意味がわからない

からだと思っています。

逆に言うと正規表現の呪文からメタ文字を見分けることができ、かつメタ文字の意味を理解できさえすればある程度は正規表現を読めるのではないでしょうか。

というわけで

  • メタ文字の見分け方
  • メタ文字の意味を理解する

の2点について書こうかなと思ったんですが、「メタ文字の意味を理解する」について書き出すと1記事にまとまらないし上記の丁寧な記事もあるのでこの記事では「メタ文字の見分け方」に絞って書いていこうと思います。何事も棲み分けです。

メタ文字の話の前に

そもそも論になりますが基本的に正規表現/で始まり/で終わります。(※言語によっては/でない場合もあるかもしれません)

/の前後にオプションの文字をつけることもありますが、基本的には/で囲われてる部分が正規表現なんだな〜くらいの認識でいいと思います。

ですので冒頭で挙げた例/\d{2,5}[-(]\d{1,4}[-)]\d{4}/において/正規表現の始まりと終わりを示すだけのものなので、正規表現としての中身は\d{2,5}[-(]\d{1,4}[-)]\d{4}の部分になります。

※これ以降の正規表現の例では/は省略します。

メタ文字の見分け方

早速いくつかの見分け方を挙げていきます。

\ + アルファベット でメタ文字

アルファベットの前に\がついていたらそいつはメタ文字です。

同じアルファベットでもdは普通の文字だし\dはメタ文字です。

仮にabc\defgという文字列が並んでいた場合a,b, c, e, f, gは普通の文字ですが\d、お前はメタ文字だ。

これは\ + アルファベットというところがポイントで、\がついていれば全てメタ文字」というわけではないので注意が必要です。

後述しますが、逆に\*はメタ文字じゃなかったりします。闇が深い。

記号はだいたいメタ文字

記号はだいたいメタ文字です。警戒してください。

特に頻出なのは{}, [], (), +, *, ?, ., ^, $, |などです。正規表現においてこれらの記号には常にメタ文字として何らかの意味を持っています。

もちろん全ての記号文字がメタ文字というわけではなく、特に正規表現としての意味を持たない記号もあります。詳細についてはいろいろ調べてみてください。

しかし、?などは疑問文で多用しますし単に?という文字として扱いたい場面もあります。

そのような場合は対象となる記号の前に\をつけることで、正規表現としての?の意味をエスケープすることができます。

そのため先ほど挙げたように\*はメタ文字ではなく普通の文字として扱われるのです。

カッコで囲われていたらメタ文字のグループ

大抵の場合、メタ文字は複数の文字列である意味を持った正規表現として扱われます。むしろ1文字で独立して存在する場合の方が稀です。

複数の文字列がメタ文字として扱われる場合、(), {}, []などで囲われていることが多いです。

例えば[A-Z]abcとあった場合、[A-Z]正規表現として意味を持つメタ文字のグループであり abcは普通の文字です。

まとめ

  • \ + アルファベット
  • 記号
  • カッコ

この辺りはだいたいメタ文字だと思って文字列を眺めましょう。

ちなみに冒頭に挙げた\d{2,5}[-(]\d{1,4}[-)]\d{4}ですが、上の項目を意識して眺めるとざっくり\d, {2,5}, [-(], \d, {1,4}, [-)], \d, {4}のようにグルーピングできる気がしてきますね。

メタ文字をメタ文字として識別できるだけでグッと正規表現の文字列が読みやすくなるので、このように意識しながら正規表現を眺めてみてください。

あとはメタ文字を理解するだけ

正規表現、わかった気になれたでしょうか。

ここまで来ればあとはもうメタ文字の意味を理解してうまいこと使いこなすだけで正規表現マスターですね。

今回は詳しい説明はしません(できません)が各メタ文字の解説は下記サイトなどで調べられるので参考にしてみてください。

正規表現言語 - クイック リファレンス | Microsoft Docs

それでは素敵な正規表現ライフを!