食わず嫌いしていた正規表現を勉強し直したら、単純作業がめっちゃ楽になった話

はじめに

この記事は WMMC Advent Calendar 2025 の 12 日目の記事です。(日付 2 回変わってるけど)
昨日の記事 に続き、James がお送りします。

tech-kotalog.hatenablog.com

adventar.org

今日のテーマについて

さて、今日のテーマは 正規表現 です。
なぜこのテーマを選んだのか、少しお話しします。

昨日の記事 の中で、PowerRename という機能を紹介しました。その中で「講義 ○○ 用」というフォルダ名から「○○」だけを取り出すために、 「講義 」を消してから、さらに「 用」を消す、という 2 段階の方法を載せました。

しかし実は、これは正規表現を使えば一発でできます。(恥ずかしい…)

正規表現は、プログラミングの授業で Python を扱ったときに少し触れたものの、 正直あまり覚えておらず「使い方がよく分からない」状態でした。

そこで今回、正規表現をあらためて勉強し直すことにしました。

この記事では、正規表現の網羅的・教科書的な仕様説明は行わず、 マウス開発や日常的な作業の中で実際に使えそうな部分に絞って解説します。

学習に使用したサイトはこちらです。

また、Gemini に簡単な問題を出してもらいながら練習もしました(本当に基礎だけですが)。

これだけは押さえよう

\d(デジット)

数字を意味します。とりあえず「数字を探したい」ときは、まずこれを使えば OK です。

.(ドット)

任意の 1 文字を表します。「なんでもいい 1 文字」です。

*+(繰り返し)

直前の文字が何回続くかを指定します。

  • *アスタリスク:0 回以上(なくてもいいし、何個あってもいい)
  • +(プラス):1 回以上(最低 1 個は必要)

よく使う .* は「なんでもあり」という意味になります。
また \d+ と書くと、「1 桁以上の数字(123 や 4567)」を表します。

()$1(グループ化とキャプチャ)

マッチした部分を、変数のように保存できます。
たとえば (\d+) でつかんだ数字は、置換時に $1 と書くことで再利用できます。

いろいろ使ってみる

PowerRename の例

先ほどは 2 回削除する方法を紹介しましたが、正規表現を使えば次のように 1 回で変換できます。

PowerRename 正規表現

検索:

講義 (.*) 用

置換:

$1

とすることで、「講義 」と「 用」に挟まれた部分だけを取り出せます。

 

ここからは、VSCode などのエディタで使える正規表現をいくつか紹介します!

先頭のスペースを消したい!

ネット上のコードをコピペした際、先頭にスペースや行番号が入り、 BackSpace を連打して消した経験はありませんか。

これも正規表現を使えば一発です。

ここでは「先頭に半角スペースが 1 つ入っている」ケースを例にします。 (今回は例としてスペースですが、タブでも同様です)

置換前

検索:

^(半角スペース)(.*)
  • ^:行頭
  • (半角スペース):先頭にあるスペース
  • (.*):それ以降のすべての文字

置換:

$1

これにより、「先頭のスペースを除いた部分」だけが残ります。

数百行のコードを扱う場合、非常に便利です。

置換後

もし先頭が 1. のように「行番号 + ピリオド + スペース」の場合は以下のようにします。

検索:

^\d+\. (.*)

置換:

$1

デバッグ用の printf を大量に削除・コメントアウト・変更したい!

デバッグ用に printf を多用することはよくありますが、 提出前や本番前には削除・コメントアウトしたくなります。

単純に printf を検索すると、 残したいものまで巻き込んでしまうのが問題です。

そこで、デバッグ用の printf は必ず "debug" から始める という運用ルールを提案します。

printf("debug: hoge = %d\n", hoge);

こうしておくと、正規表現デバッグ用だけを狙い撃ちできます。

検索例:

^.*printf\("debug.*\);$

これらを削除したい場合は、置換を空欄にします。
コメントアウトしたい場合は、置換に //$0 を指定します。

$0 は「マッチした行全体」を意味します。

この方法は非常に便利なので、ぜひ「debug ルール」を導入してみてください!

関数の引数の順番を入れ替えたい!

自作関数として仮に motor_set(speed, duty) という関数があったとします。しかし途中で仕様変更で motor_set(duty, speed) に直したくなった時、全てを変えに行くの大変ですよね…

これも正規表現を使うと簡単に置換することができます。

検索:

motor_set\(([^,]+), ([^)]+)\)

置換:

motor_set($2, $1)

解説:

  • ([^,]+) : カンマ以外の文字が1回以上続く(=第1引数全体)
  • ([^)]+) : 閉じカッコ以外の文字が1回以上続く(=第2引数全体)
  • $2, $1 : 2番目と1番目を逆順で出力

終わりに

いかがだったでしょうか。正規表現は「呪文」みたいでとっつきにくいイメージがあるかもしれませんが、今回紹介したものを覚えるだけで単純作業の効率が爆上がりします!
覚えるの苦手な人とかはせめて「正規表現」という便利なツールがあることだけ覚えておいて、面倒なタスクにあった時に、「あれ使えるかも!」と思い出して、ぜひチャッピーやジェミ兄に聞いていきましょう!

明日は、tomoya さんによる記事です!お楽しみに~!