kick the base

Houdiniと、CG技術と、日々のこと。

ノンプログラマーのための正規表現入門 1

今回はノンプログラマー向けの正規表現入門記事です。業種問わず、コンピュータを用いて文字を書く人すべてに向けての記事となります。

正規表現という言葉を聞いたことがない方でもわかるよう書いたつもりなので、ご興味があれば最初の章だけでも読んで見てください。

「ああ、これどうやるのか知りたかったんだよね」となった方は読み進めていただければと思います。

ちなみに正規表現をちゃんと説明するとそれだけで一冊の本が書けてしまうほどのボリュームがありますので、今回は本当に一例のみの紹介とし、読み終わった後に正規表現について自分で調べる(学べる)事ができるようになってくれればいいなと思っています。

「正規表現、はじめの一歩」くらいの記事になれば幸いです。

本当は、先日書いたPhotoshop/JSX: フォルダ内の画像を開き、調整レイヤーを追加して保存するのコードを改造する方法の解説として書き始めたのですが、正規表現の解説における分量が多くなりすぎてしまったため、記事を分割します。

JSXの改造編はノンプログラマーのための正規表現入門 2で説明したいと思います。

問題編

通常の検索置換しか使いませんので、Windowsならメモ帳など、Macならテキストエディットなど元から入っているテキストエディタで試してみましょう。

「プリンター」を「プリンタ」に置き換える

これは普通の検索置換で簡単にできます。やってみましょう。

検索・置換 対象のテキスト
{start} 昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。
検索: プリンター 昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。
置換: プリンタ 昨日買ったプリンタがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンタ安かったのでつい。

問題なくできましたね。

「プリンタ」を「プリンター」に置き換える

これはどうでしょう? とりあえずやってみます。

検索・置換 対象のテキスト
{start} 昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。
検索: プリンタ 昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。
置換: プリンター 昨日買ったプリンターーがもう壊れてしまった。
やはりプリンターは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンターー安かったのでつい。

どうでしょう?

  1. プリンタ > プリンター
  2. プリンター > プリンターー

1はいい結果ですが、2はプリンターーになってしまっていてダメですね。今はまだ対象が少ないから手で置き換えても良いですが、これが100個や1000個になると人力では不可能です。ミスも発生するでしょう。そこで、

  1. プリンタ > プリンター
  2. プリンター > プリンター

こんな感じで空気を読んでくれる検索・置換ができたら良いと思いませんか?

これを可能にするのが正規表現検索・置換です。

解決編(正規表現の考え方)

ここから正規表現を使っていきます。WindowsもMacもはじめから入っているテキストエディタでは正規表現検索・置換はできないのでフリーソフトを入れて試してみましょう。

Windowsであればサクラエディタなどを、MacであればCotEditormiなどが正規表現に対応しています。

しかしここではWindows/Macともに同じ環境で気軽に試せるよう、正規表現チェッカー javascript aidというWebサービスを利用させていただきましょう。*1

使い方は簡単ですが、一応説明します。

正規表現チェッカーの使い方

対象文字列

サンプルとなる下記文章を対象文字列に入れましょう

昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。

オプション

下記デフォルトのままでOKです(細かい説明は割愛します)

  • 全文検索(g) : オン
  • 大文字、小文字の区別なし(i) : オフ
  • 複数行を対象(m) : オン

パターン文字列

ここに正規表現バターンを書いていきます。答えを先に書いてしまうとプリンター?が入ります。

正規表現の考え方

正規表現自体は奥深く、豊かな表現力を持ってるがゆえに難しくもあるのですが、基本の考え方はシンプルです。

文字をパターンでとらえ、そのパターンに当てはまるものを置換するというものです。

さて、実際に「プリンタ」と「プリンター」というふたつの文字をひとつのパターンで表現し、それを「プリンター」で置換してみましょう。

今回使うの正規表現パターンはプリンター?です。最後に出てくる?は正規表現において特殊な意味を表すもので、ひとつ前の文字があってもなくてもマッチするよという意味になります。

つまりプリンタプリンターにマッチするということです。(検索に当てはまることをマッチといいます)

このように正規表現ではひとつのパターンで複数の文字列を表現するというのがポイントになります。

さあ、実際の結果を見ていきましょう。

検索・置換 対象のテキスト
{start} 昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。
検索: プリンター? 昨日買ったプリンターがもう壊れてしまった。
やはりプリンタは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。
置換: プリンター 昨日買ったプリンターがもう壊れてしまった。
やはりプリンターは地元の家電量販店で買った方が良かったか。
オンラインストアのほうがプリンター安かったのでつい。

正しく置換できましたね。今回は対象が「プリンタ」と「プリンター」のふたつの文字列だけでしたが、拡張子ならどんなのがきてもマッチするみたいな無茶なものも、HTMLタグの中身全部みたいなものもひとつのパターンで書くことができたりするのです。

いかがでしょうか。正規表現って便利そうと思っていただければ本記事の役割は果たせました。あとはご自分で調べていくことができるでしょう。正規表現を使うと文字の編集速度が圧倒的に上がります。生産性を上げて、よりクリエイティブな時間を増やしてください。

蛇足

インターネットを検索すれば、正規表現のまとめや構文、入門記事も大量に出てきます。では今更なぜ入門記事を書いたのか。それは、既存の情報ではまず最初に正規表現のメタ文字(今回出てきた?などの特殊な意味を持つ記号)を説明し、それの使い方を解説するというものが非常に多かったからです。

正規表現は道具です。道具は何かを解決するために存在します。ぼくはこんなことしたかったんだけど、どう調べたら良いかわからないから検索のしようもなかったという問題に対し、それ正規表現でできるよ!という流れの説明をしたかったのです。

カナヅチを前にこんな釘もあんな釘も打てる。というより、この木と木をうまく固定したいと思ったときに、カナヅチを差し出すようなことをしたかったのです。

ちゃんと出来たかわからないけど。

この広大なネットの海に、ひとつの冗長な解説が増えたところで困る人はいないでしょう。しかし、本解説によって正規表現に興味を持っていただいた方がひとりでもいれば、これにまさる喜びはありません。

*1:正規表現には方言があり、エディタやプログラム言語によって書き方が変わるのですが、今回は話をわかりやすくするという目的もありWebサービスを利用しました。本記事の正規表現はJavaScriptのものとなっています。