正規表現とは
正規表現とはある文字列を特別な文字を組み合わせることによって表現する方法です。
正規表現を利用することで特定の文字列を検索したり、置換することが可能になります。
正規表現はどこに使われているのでしょうか。
例えば、Webサイトには個人情報を入力するフォームがあります。
フォームに入力される情報が正しい形式で用いられているかをチェックする際に正規表現は使われています。
Emailアドレスであれば、@が入っているか、パスワードであれば指定された文字数以上か、などになります。
正規表現の基本的な仕組み
構文を見る前に正規表現がどのような順序で動作しているかを見ましょう。
文字列に対する正規表現のパターンマッチは下記のように動作します。
- 1. 文字列の先頭から調べる
- 2. 調べた文字がマッチしなかった場合は、次の文字に移動する
- 3. 途中でマッチした場合は、その位置でマッチング作業を終える
- 4. マッチするものがなければ、文字列を最後まで調べて終わる
正規表現の記述方法
正規表現で基本の記述方法は以下になります。
/パターン/パターン修飾子
要求する数字、アルファベットのルールの形式をパターンと言います。
パターンと対象の文字を照合することで、任意の形式に一致するかを調べます。
パターン修飾子はチェックの方法を細かく指定することができます。
パターンの表現法一覧
文字 | 動作 |
[] | 囲まれた中のいずれか一文字に一致する |
– | []の中に記述する。文字の範囲を表す |
^ | 文字の先頭を意味する。[]の先頭に記述した場合、否定の意味になる |
$ | 文字列の末尾を表す |
. | 改行以外の1文字と一致する |
\n | 改行と一致する |
| | 複数の文字列のうち、いずれかと一致する(OR) |
() | サブパターン(単位)を作る。1つの単位として扱うことができる |
? | 直前の文字が0回または1回一致する |
* | 直前の文字が0文字以上連続する箇所と一致する |
+ | 直前の文字が1文字以上連続する箇所と一致する |
{n} | 直前の文字がn文字一致する |
{n,} | 直前の文字がn文字以上連続する箇所と一致する |
{n,m} | 直前の文字がn文字以上、m文字以下の範囲で連続する箇所と一致する |
パターン修飾子一覧
記号 | 動作 |
i | 大文字にも小文字区別無く照合する |
m | 改行 \nがある 複数行 の検索対象文字列を 1行 として処理する ^ は各行の先頭に、$ が各行の末尾に一致するようになる |
s | .が 改行 \nにもマッチするようになる |
u | 正規表現パターンと検索対象文字列をUTF-8として処理する |
A | 正規表現パターンは検索対象文字列の先頭でのみマッチングするようになる |
D | メタ文字 $(ドル) は検索対象文字列の最後にのみマッチする 修飾子m が設定されている場合は無視される |
正規表現の例文解説
正規表現の例文をいくつか紹介します。
/abc/:文字列中にabcが含まれているかチェックする
/[abc]/: 文字列中にabcのどれかが含まれているかチェックする
/^[a-zA-Z]/:文字列の先頭にアルファベットが含まれているかチェックする
/[^a-zA-Z]/:文字列中にアルファベットが含まれていないことをチェックする
/abc|xyz/:文字列中に abcもしくはxyz が含まれているかチェックする
/lo+se/ :文字列中にoが何回含まれているかチェックする。例えば、looseの場合、2を返す。
/(good){2}/ :文字列中に good が2回含まれているかチェックする
PHPの正規表現を用いる関数
PHPの正規表現を用いる代表的な関数を3つ紹介します。
preg_match() : 指定した正規表現パターンにマッチした文字列を検索します。
preg_replace():指定した正規表現パターンにマッチした文字列の検索及び置換を行います。
preg_match_all():繰り返し正規表現の検索を行う場合に使用します。
preg_matchの使い方
<?php if (preg_match("/cake/", "私はcakeを食べます")) { echo "マッチしました。"; } else { echo "マッチしませんでした。"; } ?>
preg_replaceの使い方
<?php $subject = '私はcakeが好きです'; $search = '/cake/'; $replace = 'icecream'; $subject = preg_replace($search, $replace, $subject); echo $subject; //実行結果:私はicecreamが好きです ?>
preg_match_allの使い方
<?php $text = 'This is a pen. Pen is to write something.'; $reg = preg_match_all('/bob/i',$text,$matches); var_dump($matches); ?>
この場合、penとPenが一致します。
コメント