アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

個人的によく使う正規表現サンプル

サンプル集なので詳しい説明はしません。
動作確認はPHPでやっています。

あと、開発の都合上、厳密なチェックはあまりやっていません。
簡単な桁数チェック後にDBに問い合わせて存在有無の確認…等のパターンが多いので。

あと、複雑すぎてパッと見何やってるか分からないやつはバグの温床だし。
ご利用の際は自己責任でどうぞ。

ちなみに試行錯誤段階では以下のツールを使わせてもらうことが多いです。

参考:PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.0
http://okumocchi.jp/php/re.php

日時

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

日付は正規表現でのチェックは面倒なのでやりません。
とりあえず↑で「nnnn-nn-nn」の形式であるかどうかだけチェック。
後はハイフン区切りで年月日を取り出してcheckdate関数でチェック…という感じ。

/^([0-1][0-9]|[2][0-3])[:][0-5][0-9]$/

00:00~23:59の時刻を表す文字列がヒット。

/^([0-1][0-9]|[2][0-3])[:][0-5][0-9][:][0-5][0-9]$/

秒まで必要な場合はこちら。
00:00:00~23:59:59までがヒット。

数値系

/^[0-9]{1,9}$/

0と自然数。先頭の0も許容
MySQLの整数型の仕様に合わせ、9桁以内

/^([0-9]|[1-9][0-9]{1,8})$/

0と自然数。2桁以上の場合、先頭の0は許容しない
MySQLの整数型の仕様に合わせ、9桁以内

/^[-|+]?[0-9]{1,9}$/

整数。半角の符号が使用可。先頭の0も許容

/^([0-9]+,)*([0-9]+)$/

カンマ区切りの数字
(桁区切りというより、「IDをカンマ区切りで複数指定」みたいな用途向け?)

文字列系

鬼門。
文字コードやマルチバイト文字にかなり影響されるのでテストを厚めにやるべし。
あと、マルチバイト文字を含む可能性がある場合、文字数は正規表現ではなくカウント用関数で見る方が安全。

/^[a-zA-Z0-9_.]{4,16}$/

4~16字の半角英数・アンダースコア・ピリオド(パスワード的な)

/^[ぁ-ゞー]+$/u
/^[ァ-ヾ]+$/u

ひらがなのみ・全角カタカナのみ。
仕様や文字コード表と相談してどこまでを範囲とするか決める必要あり。

/^[一-龠]+$/u

漢字のみ
(※文字コードによって変わる可能性あり)

URL

/^https?:\/\//
/^(https?|ftp):\/\//

http:// もしくは https:// で始まる文字列がヒット。
さらに ftp:// なんかを許可したい場合は後者を。
大変雑なので、もっと厳密なチェックが必要な場合はそれなりにどうぞ。
その時は日本語ドメインを許可するかどうかなども考慮にいれる必要あり。

メールアドレス

会社では共通化されている関数でチェックしているのであまり深く気にしていませんが、調べたら論争やばいこわい。

参考:メールアドレスを表す現実的な正規表現 - Qiita
http://qiita.com/sakuro/items/1eaa307609ceaaf51123

参考:「PHP使いはもう正規表現をblogに書くな」と言わせないでくれ - 404 Blog Not Found
http://blog.livedoor.jp/dankogai/archives/51189905.html

参考:99%のEmailアドレスにマッチする正規表現公開される - ソフトアンテナブログ
http://www.softantenna.com/wp/webservice/email-regular-expression/

わたしは最後の記事のこれが好きですね。

メールアドレス自体を厳密に検証するのはあまり意味がなく、最低限@があるかどうかをチェックして、ダミーのemailを送信することで正しさを検証する方法

会員登録時やアドレス変更時なら仮登録メールや変更確認メール送りゃいいし。
データベースにちょっと変なアドレス入ってたところでだから何って感じだし。
(あくまで弊社システムの仕様上問題ないというだけで、世の中には厳密なチェックが必要な場面があるのかもしれませんが)