ZATYのBLOG

お問い合わせする

正規表現を用いた検索と置換の使い方とメタ文字一覧

正規表現は、文字列の検索や置換をするためのとても強力なツールです。

プログラムコードの記述として使用するだけでなく、.htaccessによるリライトルールの記述やコードエディタを使用している時にも使用します。

この記事では、正規表現の理解を深められるよう解説します。

正規表現とは

正規表現は、文字列の検索や置換をする際に使用します。主に、“プログラムの一部として”か“コーディング記述中”に使います。

プログラム中に使用するとき

プログラム中で使用する場面の一例を紹介します。

ユーザーから入力されたデータを処理する際に正規表現を利用する例です。

あるシステムでは、クライアント番号を“EX8719” “YA1352”のようにアルファベット2文字、数字4文字で識別をしているとします。このプログラムでは、ユーザーから入力された値が、この形式と正しいかどうかを識別し、形式が異なればエラーを表示する必要があります。この時のPHPコードは以下のようになります。

<?php
if ( preg_match( "/[A-Z]{2}\d{4}/", $_POST["client_id"] ) ) {
  echo "クライアント番号は形式通りです。";
} else {
  echo "クライアント番号の形式が間違っています。";
}

このプログラムの[A-Z]{2}\d{4}の部分が正規表現です。それぞれの正規表現の意味については後述の正規表現一覧を確認してください。

コーディング中に使用するとき

コーディング中では、置換として正規表現を利用することが多いです。置換をする際に、()で囲ってグループ化した部分は、$1$2のように引用することができます。例えば、ドキュメント内で、h1タグが乱用されている場面を想定します。

<h1 class="fruits">フルーツ</h1>
<p>りんご</p>
<p>みかん</p>
<h1 class="area">地域</h1>
<p>東京</p>
<p>大阪</p>
...

このように乱用されているh1を全てh2に置き換えます。以下の正規表現と置換文字に指定することで、一気に置換することができます。

<h1(.*?)>(.*?)</h1><h2$1>$2</h2>

$1が1つめの(.*?)に該当し、h1タグの属性を引用します。$2はh1タグのテキスト部分を引用します。

よくあるミス

[.]はピリオド

.は「任意の1文字」ですが、[]との併用はできません。

例えば、.\n以外の文字を検索できることから、全ての文字列を検索しようとして[.\n]と指定した場合、思っている挙動になりません。[.\n]は改行かピリオドを検索します。もし、全ての文字列を検索したい場合は、(\n|.)と指定するか、[\n\s\S]と指定する必要があります。

^の扱い方

^は先頭であることを示す使い方と、[^@]のような文字列の否定として検索する使い方の2通りの使用場面がある正規表現です。混合して覚えてしないように気をつけましょう。

正規表現一覧

正規表現は、プログラミング言語やコードエディタによって、一部仕様が異なることがあります。この一覧では、特にJavaScriptの正規表現エンジンの一覧をまとめます。

.
任意の1文字

「ABC」や「あいう」などの文字やスペースも含まれます。改行は含まれません。

[@]
@に指定した文字。複数指定可能。
  • 例1)[ABC] → AかBかCにマッチ
  • 例2)[A-C] → 同様AかBかCにマッチ
  • 例3)[ぁ-ん] → ひらがなにマッチ
[^@]
@以外に指定した文字。複数指定可能。

文字列の否定とするための正規表現です。

  • 例1)[^ABC] → AかBかC以外にマッチ
  • 例2)[^A-C] → 同様AかBかC以外にマッチ
  • 例3)[^ぁ-ん] → ひらがな以外にマッチ
^
行頭

^ABCは「ABC」で始まる行にマッチします。

$
行末

ABC$は「ABC」で終わる行にマッチします。

?
直前の文字が0回または1回

ABC?は「AB」または「ABC」にマッチします。

*
直前の文字が0回以上

ABC*は「AB」または「ABC」または「ABCC」などにマッチします。

+
直前の文字が1回以上

ABC+は「ABC」または「ABCC」、「ABCCC」などにマッチします。

*?
直前の文字が0回以上の最小マッチ

AB.*?Eは「ABCDEAAAE」という文字列があったとき、「ABCDE」にマッチします。

AB.*Eとの違いはAB.*Eの場合、「ABCDEAAAE」という文字列があったとき、「ABCDEAAAE」にマッチしてしまう点です。

+?
直前の文字が1回以上の最小マッチ
{n}
直前の文字がn回

ABC{2}は「ABCC」にマッチします。

{n,}
直前の文字がn回以上

ABC{2,}は「ABCC」または「ABCCC」などにマッチします。

{n,m}
直前の文字がn回以上m回以下

ABC{2,5}は「ABCC」または「ABCCC」「ABCCCC」「ABCCCCC」にマッチします。

\
エスケープ

特殊文字をエスケープします。

  • 例1)\. → 「.」にマッチ
  • 例2)\? → 「?」にマッチ
  • 例3)\* → 「*」にマッチ
  • 例4)\+ → 「+」にマッチ
  • 例5)\{ → 「{」にマッチ
  • 例6)\} → 「}」にマッチ
  • 例7)\[ → 「[」にマッチ
  • 例8)\] → 「]」にマッチ
  • 例9)\( → 「(」にマッチ
  • 例10)\) → 「)」にマッチ
  • 例11)\- → 「-」にマッチ
  • 例12)\^ → 「^」にマッチ
  • 例13)\$ → 「$」にマッチ
  • 例14)\| → 「|」にマッチ
  • 例15)\ → 「\」にマッチ
\n
改行
  • 例1)^\n → 空改行にマッチ
  • 例2).*\n → 改行を含む行にマッチ
\s
空白文字

半角スペース、全角スペース、タブ、改行にマッチします。

VSCodeの場合、改行にはマッチしません。

^\s*と指定することで、行頭の空白文字を削除することができます。

\S
空白文字以外
\d
数字
  • 例1)\d → 半角数字にマッチ
  • 例2)\d{7} → 半角数字7文字にマッチ
\D
数字以外
\w
半角アルファベットとアンダーバー
\W
半角アルファベットとアンダーバー以外
(@)
グループ化

グループ化することで、マッチした文字列を取得することができます。

グループ化した文字列は、$1$2$3のように取得することができます。

例)(\d{4})-(\d{2})-(\d{2}) → 「2020-01-01」にマッチした場合、$1は「2020」、$2は「01」、$3は「01」になります。

|
論理和

「|」の左右のどちらかにマッチする場合にマッチします。プログラミングでいう、"or"にあたる正規表現です。

例)ABC|DEF → 「ABC」または「DEF」にマッチします。

まとめ

正規表現はプログラムやリライトルールで使用する以外にも、コーディング中にもよく使用します。特にコードの差し替えや修正の際に効果を発揮します。正規表現を覚えて、コーディングを効率的にすることができます。

よく使う正規表現や効果的な置換を見つけ次第、今後もこの記事に追記していきます。