正規表現

はじめての正規表現『イメージをつかむ』

2020年10月11日

jag

「毎日の学習の記録」と「経験から伝えられる情報」。これがこのブログのメインコンテンツです。筆者は2020年8月に葬儀スタッフからエンジニアとして転職して駆け出したばかり。だからこそ伝えられる情報・日々の学びを発信していきます。

かけだしコアラ
正規表現って複雑でよく分からない

そもそもなんで必要なの?

こんな疑問に答えます。

本記事では、30歳からプログラミングスクール『TECH CAMP』に通い、システムエンジニアとして転職した僕が完全初心者向けに正規表現について説明します。

内容の濃さよりも初学者の方に「正規表現についてなんとなく分かった!これからちょっと検索すれば使えそう!」と思ってもらえる内容にします。

独学していて正規表現でつまづいた人

正規表現に苦手意識を持つ人にとっては参考になる内容です。

また、今回使用する正規表現はphpで実現できるものとします。

では早速まいりましょう!

正規表現とは

正規表現とは一言で言うと「様々な文字列をひとつの文字列で表現する表現法」です。

どういうものかというとこんな感じ。

/^[0-9]{3}-[0-9]{4}$/

これはハイフン(-)を含む郵便番号(ddd-dddd)を表す正規表現です。(※この正規表現を表す各記号については後ほど解説します)

例えば、123-4567 も012-3456 もこの正規表現にマッチします。

マッチする」とは「この正規表現が表すものに該当するよ」ということ。

つまり「123-4567も、012-3456も郵便番号だよ」ということが「マッチする」ということです。

この特性は文字列の判定を行い、検索や置換などに便利です。

正規表現のイメージ

正規表現は「フィルター」をイメージすると分かりやすいかもしれません。

/^[0-9]{3}-[0-9]{4}$/

例えば、この正規表現は「ハイフン付きの郵便番号だけを通すフィルター」です。

このフィルターに対して、3つの文字列を送り込んでみましょう。

すると、ハイフン付きの郵便番号である123-4567は正規表現のフィルターを通り抜けたのに対し、他の2つの文字列は跳ね返されてしまいました。

このように、「一定の文字列だけを通すフィルターを用意する」ということが「正規表現を書く」ということです。

正規表現がどのようなものか分かったところで、なんで必要なのか、と言うことについて考えてみましょう。

正規表現は、なぜ必要か

実際の例を元に見ていきましょう。

以下のような郵便番号の入力欄を作るとします。

ここで、なんでも入力出来てしまうと以下のようなことが起こります。

ユーザーが真面目に入力してくれるならいいですが、そうとも限りませんし、間違って入力をしてしまう可能性もあります。

この間違った情報をそのまま保存したり、何か別の処理に利用してしまうと様々な不具合が起こります。

例えば郵便番号の場合「この情報を利用して発送した荷物が目的の住所に荷物が届かない」などが考えられますね。

そこで、入力出来る内容を制限する一定のルールを設定してあげる必要があります。

そこで役に立つのが正規表現です。

正規表現を使うことで、郵便番号として使える情報のみを受け取る入力欄の出来上がりです。

さらにこれは別の話ですが、間違った入力に対しては「000-0000の形で入力してね」と言うように正しい入力を促す文章を表示させてあげることで、さらに使いやすい入力欄にすることが出来ます。

このように正規表現は、情報に行き来に対して一定の制限をかけることで、システムやサービスが正しく動作する助けとなります。

正規表現を利用する方法

では、実際に正規表現を利用してマッチング(正規表現を使ったチェック)を行います。

phpの場合、preg_matchという関数で正規表現とのマッチングを行うことが出来ます。

記述の仕方は次の通り。

preg_match('/文字列パターン(正規表現)/', 比較する文字列);

これを使って条件分岐を行います。

マッチすれば「OK」、しなければ「000-0000の形で入力してね」と出力してみます。

<?php
$input = '123-4567';
if (preg_match('/^[0-9]{3}-[0-9]{4}$/', $input)) {
    echo "OK";
} else {
    $error = '000-0000の形で入力してね';
    echo $error;
};
?>

簡単な例ですが、これでマッチングを行うことができるようになりました。

正規表現一覧

最後に、今回使った正規表現を構成する要素をまとめます。

/^[0-9]{3}-[0-9]{4}$/

/ /

スラッシュ「/」で囲むことで正規表現オブジェクトを生成することが出来ます。

つまり、「/ /で囲まれたものが正規表現だよ」という宣言になります。

^

行頭。文字列の先頭や改行文字の直後の位置にマッチします。

例えば、/^good/ は文字列の先頭が good である文字列とマッチする正規表現です。

$

行末。文字列の末尾や改行文字の直前の位置にマッチします。

例えば、/good$/は文字列の末尾が good である文字列とマッチする正規表現です。

[ ]

角括弧[ ]で挟まれた部分を文字クラスと言います。

1個以上の文字をその中に含み、いずれかの1文字にマッチします。

-

文字の範囲を示します。

[0-9]なら0から9のうちいずれか、[A-C]ならA,B,Cのいずれかとなります。

{n}

直前の表現を n 回繰り返します。

例えば、[0-9]{3} は0から9の整数が3回繰り返される文字列にマッチします。


正規表現は他にもたくさんありますが、まずはここまでにしましょう。

最後に

正規表現は、多くの情報を扱うサービスやシステムを開発する場面において欠かすことが出来ません。

よく使われる表現は検索するとすぐに見つけられますが、少しずつ自分でも書いてモノにしていきましょう。


記事にして欲しい内容などありましたら、いつでもメッセージくださいね。

ここまで読んでくれてありがとうございます。

ではまた!

-正規表現

© 2021 jag blog Powered by AFFINGER5