一枚でわかる正規表現
個人的に好きだったGoogle Tech LeadのYouTuberが、開発者なら当然知っておくべきいくつかのスキルをアップロードしたことがあります。
- 正規表現 (Regular Expressions)
- SQL
- デバッグスキル (問題解決能力)
- ツール言語 (Tooling Language)
- 反社会的スキル (Anti-Social Skill)
この中で今日のテーマは、一番最初に挙げられた正規表現です。途中の5番目は少し場違いな気がしますが、開発者は実際にはコーディングよりもコミュニケーションを多く取る仕事だと思うので、あまり良い戦略ではないでしょうね。正規表現は、学部の頃も「後で勉強しよう」とメモはたくさんしましたが、結局きちんと覚えずに、毎回必要な時に調べて使っていたような気がします。最近整理したところ、文法のように分類して覚えると簡単でした。実際、RegexはTech Leadが言う通り、開発において非常に広く使われています。テキスト検索、正確にはパターンマッチングに使われるのですが、検索には以下のような数多くのユースケースがあります。
- grepによるログ・テキスト分析
- 開発中のコード・ディレクトリ検索
- コミット前のコードチェック
- Webスクレイピング(Webクローリング)
- URLパース
- 値・フォーマットのバリデーション
Regexは、初めて見た時や勉強する前までは、暗号か宇宙語のように見えます。これは、私たちが普段接する言語では、セマンティクスが単語またはその組み合わせで表現されますが、正規表現ではセマンティクスがそれぞれ一つの文字にマッピングされているため、暗号体系と同じように感じられるからです。これも構文(シンタックス)として分類すると以下のようになり、正規表現を習得する上で大いに役立ちます。

基本的に、特定の単語を検索するために正規表現を使用しますが、単に探したい1. 特定の単語を直接指定する方法だけでなく、2. 文字や数字の組み合わせとして単語を指定することもできます。正規表現はこれに対し、二つの方法を提供します。
基本文法
簡単に、検索したい特定の単語を直接指定すればよいです。
もし複数の単語を一度に検索したい場合は、()の中に|を使って複数の単語を入れればよいです。
文字セット
特定の文字を指定したい時は、単語と同じように使用できますが、[]を使って複数の文字を見つけたり、[]の内部で拡張表現を使ってAからZまで(A-Z)のルールを追加したり、特定の文字を除外したりすることもできます。
文字タイプ
数字の文字を検索したい場合、上で学んだように[0-9]も良いですが、『数字』の文字タイプを指定して検索することもできます。文字のタイプを指定するためのものがバックスラッシュ(\)で、例えば**『数字』の文字タイプは\dと表現でき、『数字ではない』文字タイプは\Dのように大文字で表記**できます。
拡張文法
位置指定 (アンカー)
特定の単語や文字を見つける場合でも、文章の先頭または末尾に存在するものを探したいときに使用します。
繰り返し回数 (量指定子)
特定の単語や文字が何回繰り返されたものを検索したいかを指定できます。
(abc){1} = abc (1回のみ出現)
(abc){1,3} = abc, abcabc, abcabcabc (1回から3回出現)
(abc)? = (空文字), abc (0回または1回出現)
(abc)+ = abc, abcabc … (1回以上出現)
キャプチャ = グループ化
前述の通り、パターンで検索する単語を集合としてまとめたり、検索した結果を利用したいときに結果値を保存する役割を果たします。
正規表現は一度学べば、どんな開発言語でも汎用的に使用可能で、開発で活用できるケースが非常に多いため有用です。このように整理したことで、これからは毎回調べることなくうまく使えるようになると思います。