Step by step 正規表現入門
はじめに
最近ではスクリプト系の言語はもちろん C++ 以降の言語ではほとんど正規表現が標準機能として使えるようになっています。 C++ でも C11 の新規約では正規表現が標準ライブラリとなりました。今後、正規表現はプログラミングで当たり前のように使われる流れにあると言えるでしょう。
何故正規表現がそんなに使われるのでしょうか?
それは正規表現を使えば、圧倒的に文字列処理が簡単にかけるからです。
また、プログラミング言語で使えるだけでなく、 高機能なエディターでは正規表現による検索と置換が行えます。 これはコードリーディングやコーディングを楽にしてくれます。
プログラミングをするのならば、正規表現を知らないのはもったいないです。
ただ、正規表現を覚えようとした場合、 ルールもたくさんありますし、 言語やエディターの説明では基本的なものからめったに使わないものまで まとめて説明されがちです。 そこで、 Step by Step で少しずつ覚えていけるような正規表現の入門を書いてみました。
また、実際に使いながらの方が覚えやすいので、 以下の主要なエディターでの使い方も説明しています。
- Emacs
- Visual Studio
- K2Editor
- 秀丸エディター
対象読者
プログラマー向けの内容になっています。ただ、プログラミングの知識がないと理解できない ということはないんじゃないかなと思います。
進め方
進め方は基本的に最初から順番に始めてください。ただし、途中でやめても、そこそこ役に立つ構成にしています。 途中でやめたとしても、それまでの知識で使っていれば、 次の情報も知りたいとなるかもしれません。 その時また続きを読んでください。
さっと知りたいという場合はまとめページを見てください。 細かい説明を省いて、必要な情報を簡単にまとめています。
また、正規表現はだいたい知っているから、エディターでの使い方を知りたいという人は以下のページを見てください。
Step by step 正規表現入門 - 英数字とエディターでの検索
そのための正規表現の最初のステップです。
英数字, _(アンダーバー)はそのまま
英数字とはアルファベット(a-z A-Z)、数字(0-9)です。また、プログラミングの変数名などには _(アンダーバー) も使います。これらは単語用文字と呼ばれ、正規表現ではそのまま使えます。難しく考えることはなく、英数字 _ では正規表現による検索も文字列の検索と一緒ということです。
日本語対応しているものであれば、漢字のような全角文字も使えます。これらも英数字同様そのままの文字となります。
エディターの検索機能の使い方
いくつかのエディターで正規表現を使った検索の仕方を紹介します。ここでご紹介したいのは通常のファイル内の検索ではなく、 フォルダー(プロジェクト)内の複数のファイルにまたがった検索です。 これは grep 検索と呼ばれることがあります。
こちらを中心に説明しています。
この grep 検索は正規表現を使わなかったとしても便利な機能なので、 これだけ覚えておいても損はないと思います。
ここにあげたエディターでなくても、高機能なエディターであれば、 正規表現による検索や置換の機能はまず付いていると思います。 ここでの記事を参考に自分の愛用のエディターで検索を試しながらやってみてください。
grep
と、いきなりエディターの説明ではないのですが、 grep は名前の由来となっているコマンドラインプログラムです。これはこれで便利ですし、 Unix 系であればまずインストールされているので、 こちらの紹介もしておきます。
Windows 版もいろいろ公開されているので、インストールすれば使えます。
- Grep for Windows
- 【レビュー】Cygwinより手軽にUNIX風環境が手に入る「Gow」 (1) UNIX風環境をWindows OS上で使用してきた時代 | パソコン | マイナビニュース
使い方は次のようになります。
grep [-i] 正規表現 ファイル [... ](例)
$ grep include *.h *.cppファイルは複数指定が可能で通常 *.cpp のようなフィルターを使います。 後、オプションとして大文字小文字を区別しない -i をよく使います。
プログラムを実行すると検索結果の一覧が表示されます。
Emacs
Emacs では前節の grep を利用します。 M-x grep や eshell 上で grep コマンドを実行します。実行すると検索結果が別バッファでリストに表示されます。
ただ grep を実行するのと違い、このリストでマウスの中ボタンクリックや Enter キーを押すと結果位置にジャンプすることができます。

さらに私の作った lisp も使えば、検索位置へのジャンプはより便利になります。
後で説明する K2Editor や秀丸エディターではファイルをまたがった検索は grep という名前になっているだけですが、 Emacs では実際に grep プログラムを呼び出します。 そのため、 Windows などでインストールされていない場合は、インストールして PATH を通しておく必要があります。
ファイル内の検索についても簡単に紹介しておきます。
通常のインクリメンタル検索は C-s です。これに C-u を付けた C-u C-s で正規表現によるインクリメンタル検索となります。
また、ファイル内の検索結果をリスト上に表示する occur コマンド(M-x occur)もあります。
Visual Studio
Visual Studio でも正規表現による検索は可能です。こちらは [編集] → [検索と置換] → [フォルダーを指定して検索] (Ctrl+Shift+F) などで検索ダイアログを出した後、オプションで正規表現を有効にします。

検索を実行すると検索結果のリストが表示されます。
このリストでダブルクリックや Enter キーを押すと結果位置にジャンプします。

[クイック検索](Ctrl+F)でも検索対象を変えることで、 同じ検索対象にすることができます。 ただし、動作に違いがあり、クイック検索では検索結果の位置に逐次移動していきます。
K2Editor
Windows のフリーのエディターとして K2Editor も上げておきます。私はコーディングには場合は Emacs を使ってますが、ちょっとテキストファイルを見たいといった場合にはこちらを使っています。
[検索] → [GREP] (Ctrl-G) などで検索ダイアログを出した後、正規表現にチェックを入れます。

検索を実行すると検索結果のリストが表示されます。 ただし、このリストはマウスのクリックでは結果位置の表示はできません。 [検索] → [タグジャンプ] ([F10]) でジャンプします。

通常の検索(Ctrl-F)でも、オプションで正規表現を使うことができます。

秀丸エディター
Windows のエディターとしては、秀丸エディターが有名です。 私はほとんど使ったことがないのですが、 無視もできないなということで、こちらの説明も入れておきました。[検索] → [grep の実行]のメニューから 検索ダイアログを出した後、正規表現にチェックを入れます。

検索を実行すると検索結果のリストが表示されます。 マウスのダブルクリックで結果位置へジャンプします。

通常の検索(Ctrl-F)でも、オプションで正規表現を使うことができます。
正規表現の歴史と方言
正規表現は Unix では ed といった初期のエディターから使われていましたが、 grep プログラムで広く使われるようになりました。その後、スクリプト言語の Perl で採用され、かなり拡張されます。 以降はこの Perl の正規表現がほぼ標準となったといってよく、 多くの言語やアプリで使われる正規表現は Perl の正規表現に合わせてあります。
紹介したエディターでは K2Editor は標準的な正規表現が使われています。
Emacs に関しては標準から外れた正規表現となっています。
また、 Emacs の grep コマンドは grep プログラムを実行します。 このため、 Emacs の他のコマンドや lisp のルールとも少しことなります。
Visual Studio は特に方言が強いです。 ただし、ここでの Visual Studio はエディターとしてのものです。
.NET, Boost の正規表現ライブラリといった VC++ などのコード内で使うものはそちらに従います。
秀丸エディターはバージョンによって変わってきます。
Ver. 8.13 以降はほぼ標準的な正規表現です。 それ以前は Emacs に近いルールとなっています。
このように正規表現にはアプリや言語によって書き方や使える機能に違いがあります。
そのため、この入門ではなるべく共通して使える機能だけに絞っています。 ただし、方言があるけど重要と思うものについてはその都度説明するようにしました。
次は ?
まずは英数字だけで検索を使ってみてください。 使っていくうちに、もっと検索結果を絞り込みたいと思ってくるはずです。例えばヘッダーのインクルードを見たくて、 include で検索したとき、関数名にもひっかかるといった具合です。
ここで、絞りこみをできるようにするのが正規表現です。
必要を感じると覚えやすくなります。必要性を感じながらーつーつルールを増やしていきましょう。
Step by step 正規表現入門 - ワイルドカード
これは *.txt や *.doc といったファイルのフィルターなどでよく使われます。
ワイルドカードは同じような用途に使え、ルールも簡単なので、言語やエディターで正規表現の代わりに使えるものも多いです。
ただ、そこでそのままワイルドカードを使うと、正規表現とルールが違うので次に繋がらなくなります。 ワイルドカード相当ものを正規表現で書けば、 今後正規表現のルールを少しづつ足していくことができます。
正規表現の次のステップとして、ワイルドカードを正規表現であらわすとどうなるかをやってみましょう。
ワイルドカードの特殊文字
ワイルドカードにも方言があって、 特殊文字もいろいろとありますが、 ここではよく使われる次の 2 つということにしておきましょう。特殊文字 | 機能 |
---|---|
* | 任意の文字列 |
? | 任意の 1 文字 |
*.cpp → foo.cpp, a.cpp, .cpp img???.jpg → img001.jpg, img002.jpg, imgbar.jpg
任意の 1 文字
? に相当する正規表現は、任意の 1 文字を表す .(ピリオド)です。この . のように文字そのものを指さず、特別な意味を持つものを正規表現ではメタ文字 やメタキャラクターと呼びます。
次にワイルドカードの * に対応するものは と行きたいところですが、残念ながら直接対応するものは正規表現にはありません。 その代わりに任意の 1 文字の . と繰り返し回数を組み合わせます。
繰り返し回数
繰り返し回数の指定のメタ文字は次の 3 つです。メタ文字 | 機能 |
---|---|
* | 0 回以上の繰り返し |
+ | 1 回以上の繰り返し |
? | 0 回または 1 回 |
a*bc → abc, aabc, bc a+bc → abc, aabc (bc はマッチしない) a?bc → abc, bcただし、 Visual Studio の正規表現では ? はありません。
ワイルドカードの * を正規表現で書くと .* となります。
エスケープ
. * + ? は正規表現ではメタ文字となりますがこの文字そのものを指定したいときがあります。この場合 \ を前に付けると文字そのものとなります。 このメタ文字の機能をなくすことをエスケープやクオートと呼びます。\ の文字自体を指定したい場合は \\ とします。
以上より *.cpp を正規表現になおすと .*\.cpp となります。
行頭、行末
*.cpp は .*\.cpp となると書きましたが、実は完全に同じではありません。というのも .*\.cpp は foo.cpp にも foo.cppy にもマッチするためです。 これを避けるために正規表現では、先頭と末尾となることを明示的に指定する必要があります。 これには以下の文字を使います。
メタ文字 | 意味 |
---|---|
^ | 行頭 |
$ | 行末 |
\ と英数字の組み合わせ
メタ文字の前に \ を付けるとエスケープですが、 逆に \ と英数字の組み合わせは特別な意味になります。この組みわせの正規表現のメタ文字は後で説明することにして、 プログラミングでも一般的に使われるものをまず紹介しておきます。
メタ文字 | 意味 |
---|---|
\t | タブ |
\n | 改行コード (LN) |
\r | 改行コード (CR) |
次は
ヘッダーのインクルード部分を include の文字だけで検索すると余分にヒットしました。 今回の知識を使って絞り込んでみましょう。ヒットさせたい行は次のような文です。
#include <foo/bar.h>そのための正規表現は "# で始まり、 include と .h を含む行" とします。
^\#.*include.+\.h任意文字のルールにより、だいぶん絞り込みが出来るようになりました。
次はこの任意文字をもっと細かく指定する方法に移りましょう。