パソコン作業を行う際に「正規表現」という言葉を耳にする機会もあるでしょう。正規表現について知っていると、さまざまな文字列の検索を効率化できます。ソフトウェア開発者も、正規表現のテクニックを知っていると便利です。
本記事では、ソフトウェア開発者向けに正規表現とは何かわかりやすく解説します。
- もくじ
1.ソフトウェア開発における正規表現とは
正規表現とは、決められたルールに沿って複数の文字を表現する記法のことです。複数の文字を扱いたい場合に、通常の記法だと長く、煩雑になってしまいます。しかし正規表現を使うことで、さまざまな文字をシンプルに表現することが可能です。
また、正規表現はソフトウェア開発でも頻繁に用いられます。正規表現のテクニックを知ることで、文字列を効率的に処理できるでしょう。ここでは正規表現でできることや、混同されやすい「ワイルドカード」との違いについて解説します。
1-1 正規表現でできること
正規表現を「パターンマッチング」に用いることで、文字列(文字の集まり)の効率的な検索が可能となります。パターンマッチングとは、文字列を特定のパターンと比較し、パターンの有無や出現場所を把握する手法のことです。
たとえば、郵便番号を正規表現すると、「\d{3}-\d{4}」となります。この正規表現が示すのは、「3桁の数字+ハイフン+4桁の数字」というパターンです。つまり、「000-0000」から「999-9999」までの全パターンが、この正規表現を用いた検索でヒットします。
もし正規表現を用いなかった場合、膨大なパターンを1つひとつ指定しなければなりません。正規表現によって、シンプルな表記で多くのパターンを網羅できるのです。
1-2 ワイルドカードとの違い
正規表現と混同されやすい言葉に「ワイルドカード」があります。両者の違いを把握しておきましょう。
ワイルドカードとは、任意の文字や文字列に置き換えられる特殊文字のことです。具体的には、次の2種類がワイルドカードとして一般的に使われます。
文字 | 意味 |
---|---|
? | 任意の1文字 |
* | 任意の0文字以上 |
たとえば、ワイルドカードで「appl?」と表記する場合、「apple」も「apply」もヒットします。ワイルドカードも正規表現と同様に、パターンマッチングで用いられる記法です。ただし正規表現と比べると、ワイルドカードは表現のバリエーションが限られます。
また、正規表現にも「?」や「*」を用いる表現はありますが、ワイルドカードとは機能が異なるため注意が必要です。
2.正規表現の主な活用シーン
正規表現はさまざまなシーンで活用されていますが、具体的なイメージが湧かない方も多いでしょう。ここでは正規表現の主な活用シーンを、具体例を交えて4つ紹介します。
2-1 テキストエディタの検索機能
文章やソースコードの作成に用いるテキストエディタの多くは、正規表現をサポートしています。「Visual Studio Code」や「サクラエディタ」などが代表例です。こうしたテキストエディタで文字列を検索する際には、正規表現が役に立ちます。たとえば、「(営業部|開発部)」という正規表現で、「営業部」「開発部」のいずれかを検索できます。
なお、パソコンのOSに標準搭載されているテキストエディタは、正規表現をサポートしていないことがあります。
2-2 コマンドラインツールの検索コマンド
コマンドラインツールとは、コマンドの実行によってOSを操作できるツールのことです。コマンドラインツールの多くには、特定の文字列を含むテキストファイルや、その該当行を検索するコマンドがあります。
これらの検索コマンドを用いる場合も、正規表現の利用が可能です。たとえば、「^a」という正規表現で、「aから始まる行」が含まれるファイルをまとめて検索できます。
ただし、コマンドラインツールによって使える検索コマンドは異なります。Windowsの「コマンドプロンプト」では「findstr」、macOSの「ターミナル」では「grep」といった検索コマンドが利用可能です。また、正規表現のルールも異なる場合があります。
2-3 プログラミング
ソフトウェア開発で正規表現がよく用いられるのはプログラミングです。プログラムの記述に使われるプログラミング言語の多くは、正規表現の機能を提供しています。ソフトウェア内で文字列を扱う際には、こうした機能が役立つでしょう。
たとえば、ユーザーが入力した文字列を「\d{3}-\d{4}」という正規表現と比較し、正しい郵便番号かどうかをチェックできます。ただし、プログラミング言語によっては正規表現を使うために追加のプログラム導入が必要です。また、言語によって正規表現のルールが異なる場合もあります。
2-4 データベース操作
大量のデータを扱うための仕組みである「データベース」の操作時にも、正規表現がよく使われます。データベースの操作には「SQL」という言語を用いるのが一般的ですが、正規表現を使うことで複雑な条件での検索が可能です。たとえば、「com$」という正規表現でメールアドレスを検索する場合、末尾が「com」で終わるデータのみ抽出できます。
一般的なサービスやシステムの多くには検索機能がありますが、それらのデータベース操作に正規表現を使える場合も多いです。ただし、使用しているデータベース管理システムの種類やバージョンによって、正規表現のルールは変わる場合があります。
3.正規表現の基本要素一覧
正規表現を活用するうえで、2つの基本要素の理解が欠かせません。ここでは2つの基本要素について、表を交えてお伝えします。
3-1 メタ文字(特殊文字)
「メタ文字(特殊文字)」とは、正規表現において特別なルールが適用される文字のことです。代表的なメタ文字のルールや使用例は以下のとおりです。
文字 | ルール | 使用例(該当パターン) |
---|---|---|
. | 任意の1文字 | appl.(apple、applyなど) |
* | 直前の文字を0回以上繰り返す | ap*le(ale、aple、apple...) |
+ | 直前の文字を1回以上繰り返す | ap+le(aple、apple、appple...) |
? | 直前の文字を0回または1回繰り返す | ap?le(aleまたはaple) |
^ | 直後の文字列が行の最初に登場する | ^apple(apples、apple pieなど) |
$ | 直前の文字列が行の末尾に登場する | apple$(my apple、pineappleなど) |
| | 両側にある文字列のいずれか | apple|apply(appleまたはapply) |
[ ] | []内のいずれか1文字 | [apl](a、p、lのいずれか) |
こうしたメタ文字の使い方が、正規表現におけるポイントとなります。
3-2 エスケープシーケンス
メタ文字を純粋な文字として扱いたい場合、不都合が生じます。たとえば、正規表現が有効な状況で「1+1」を純粋な文字列として表現したい場合、「+」には正規表現のルールが適用されてしまうのです。つまり、「11」「111」「1111」...という意味になります。
こうしたケースで役に立つのが、「エスケープシーケンス」です。エスケープシーケンスとは「\」(円マークまたはバックスラッシュ)のことで、直後のメタ文字に正規表現のルールを適用させない機能があります。上記の「1+1」を純粋な文字列として扱いたい場合は、「1\+1」とエスケープシーケンスを用いればOKです。
また、エスケープシーケンスに特定の文字列を続けることで、特別な意味を持たせることもできます。代表例は下表のとおりです。
文字 | 意味 |
---|---|
\n | 改行(LF) |
\r | 改行(CR) |
\t | タブ |
\d | すべての数字(0~9のいずれか) |
エスケープシーケンスも正規表現でよく活用されるため、把握しておきましょう。
4. POSIXにおける正規表現の代表的なテクニック一覧
ソフトウェア開発に正規表現を活用するのであれば、基本的なテクニックを押さえましょう。正規表現のルールは規格によって変わってきますが、ここでは「POSIX」に準拠した正規表現のテクニックを紹介します。POSIXとは、UNIX系のコンピューターOSに関するルールを定めた規格です。
4-1 文字の繰り返し
同じ文字を繰り返したい場合、反復回数が多いほど文字列が長くなってしまいます。しかし「+」や「*」を用いれば、シンプルに表現が可能です。たとえば「ap+le」と表現することで、「apppppppple」といった長い文字列もマッチさせられます。
文字の繰り返しに用いられる主な表現方法は下表のとおりです。
表現方法 | ルール | 使用例(該当パターン) |
---|---|---|
* | 直前の文字を0回以上繰り返す | ap*le(ale、aple、apple...) |
+ | 直前の文字を1回以上繰り返す | ap+le(aple、apple、appple...) |
? | 直前の文字を0回または1回繰り返す | ap?le(aleまたはaple) |
{桁数} | 直前の文字を桁数だけ繰り返す | ap{3}le(appple) |
4-2 文字クラス
特定の範囲に含まれる文字を表現したいケースもあるでしょう。たとえば、「AからZまでのいずれか」を検索したい場合が考えられます。
この場合、[ ]内に文字の範囲を指定する「文字クラス」という機能が便利です。「AからZまでのいずれか」は、[A-Z]とすることで表現できます。文字クラスにおける主な表現方法は下表のとおりです。
表現方法 | ルール | 使用例(該当パターン) |
---|---|---|
[文字1文字2文字3...] | []内のいずれか1文字 | [apl](a、p、lのいずれか) |
[文字A-文字B] | 文字A~文字Bに含まれるいずれか1文字 | [a-p](a~pのいずれか) |
[文字A-文字B]{桁数} | 「文字A~文字Bに含まれるいずれか1文字」を桁数だけ繰り返す | [a-p]{3}( abc、efg、cba、zal、pppなど) |
前述の繰り返しを表す{ }と併用する場合、まったく同じ文字を繰り返す必要はありません。[a-p]{3}という正規表現の場合、「efg」のように文字クラスに含まれる文字が3連続すればマッチと判定されます。
4-2 否定
「~以外」「~を除く」といった否定を表現したいケースも考えられます。否定は、前述の文字クラス[ ]内の最初に「^」を付けることで表現が可能です。たとえば「AとZ以外のいずれか1文字」を正規表現で検索したい場合、[^AZ]と表現できます。
否定に用いられる主な表現方法は下表のとおりです。
表現方法 | ルール | 使用例(該当パターン) |
---|---|---|
[^文字1文字2文字3...] | []内のいずれでもない1文字 | [^apl](a、p、l以外の1文字) |
[^文字A-文字B] | 文字A~文字Bに含まれない1文字 | [^a-p](a~p以外の1文字) |
4-3 OR条件
「いずれか一方」を意味するOR条件は、「|」を用いることで表現できます。たとえば、「パイナップルまたはパインアップル」を検索したい場合、「パイ (ナ|ンア)ップル」といった表現が可能です。OR条件のパターンを( )で囲みましょう。
前述の文字クラスでもOR条件は表現できますが、1文字単位でしか扱えません。「|」だと2文字以上のパターンや、パターンごとに文字数が異なる上記のようなケースでも表現が可能です。
5.正規表現を使いこなすためのポイント
正規表現には幅広いバリエーションがあり、正しく使えないとソフトウェアの不具合につながることもあります。正規表現を使いこなすためのポイントとして、次の2つを押さえておきましょう。
5-1 公式ドキュメントを参照する
前述のように、正規表現のルールはOSやプログラミング言語によって変わる場合もあります。あるプログラミング言語で使えた正規表現のルールが別の言語で使えない、というケースもゼロではありません。
そのため、正規表現を用いるOSやプログラミング言語の公式ドキュメントを参照するのが確実です。公式ドキュメントに記載された正規表現のルールに従えば、正規表現の誤用を防げます。
5-2 正規表現チェッカーを活用する
正規表現に慣れていないと、実際にマッチするパターンがイメージできない場合もあります。このような場合、「正規表現チェッカー」が役に立ちます。正規表現チェッカーは、正規表現と検索対象文字列を指定し、どの部分がマッチするかをシミュレートできるツールです。
正規表現チェッカーは、さまざまなサイトで提供されています。以下は一例です。
正規表現について学習する場合は、自分に合った正規表現チェッカーを使ってみるとよいでしょう。
まとめ:正規表現を使いこなしてソフトウェア開発の幅を広げよう
正規表現とは、決められたルールに沿って複数の文字を表現する記法のことです。
正規表現は文字列のパターンマッチングに役立ちます。テキストエディタやコマンドラインツールの検索だけでなく、プログラミングやデータベース操作でも正規表現は有用です。
正規表現を使いこなすことで、ソフトウェア開発の幅を広げられます。ただし、正規表現にはさまざまな表現方法があり、一朝一夕で使いこなせるものではありません。今回の内容を参考にしつつ、実際に正規表現を実践しながら理解を深めるとよいでしょう。