リファレンス

正規表現パターン集

コピペできる定番パターン集は世に多いですが、ここは「なぜこう書くか(部品の意味)」と「この式では足りない場面」を必ず併記します。 正規表現の事故は、たいてい限界を知らずにコピペしたときに起きるからです。 その場で自分の文字列を当てて確かめられます。

18

検証メールアドレス(実用版)

「@が1つあり、前後に空白でない文字があり、ドメインにドットがある」だけを見る割り切った検証。

/^[^\s@]+@[^\s@]+\.[^\s@]+$/
検証URL(http/https)

httpまたはhttpsで始まる、空白を含まないURLらしき文字列。

/^https?:\/\/[^\s/$.?#].[^\s]*$/
検証IPv4アドレス

各オクテットを0〜255に厳密制限したIPv4。範囲チェックまで正規表現で行う代表例。

/^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/
検証郵便番号(日本)

3桁+ハイフン(省略可)+4桁。

/^\d{3}-?\d{4}$/
検証電話番号(日本・ゆるめ)

0で始まる、ハイフン任意の国内電話番号。市外局番の桁数が地域で違うため、あえて緩くする。

/^0\d{1,4}-?\d{1,4}-?\d{3,4}$/
検証日付(YYYY-MM-DD)

月01〜12・日01〜31の形式チェック。

/^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$/
検証パスワード強度(先読み)

小文字・大文字・数字・記号をそれぞれ含む12文字以上。先読み(lookahead)を並べる定番の型。

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[\W_]).{12,}$/
検証UUID(v4)

バージョン4のUUID。version と variant のビットまで見る。

/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i
検証HEXカラー

3桁短縮形と6桁形。#は任意。

/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i
抽出HTMLタグの除去(非推奨)

「<から>まで」を消す、よく見かける手抜きタグ除去。

/<[^>]*>/g
抽出名前付きキャプチャで分解

グループに名前を付けて取り出す。番号($1, $2)より壊れにくく読みやすい。

/^(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})$/
抽出後読みで「前にあるもの」を条件にする

円記号の直後にある数字だけを取り出す(円記号自体は結果に含めない)。

/(?<=¥)\d+/g
整形・置換前後の空白を除去

行頭または行末の連続空白にマッチさせ、空文字に置換する。

/^\s+|\s+$/g
整形・置換連続空白を1つにまとめる

2つ以上並んだ空白・改行・タブを、半角スペース1つに潰す。

/\s+/g
整形・置換スラッグ化(URL用)

英小文字と数字以外をハイフンに置換して、URLに使える文字列にする。小文字化と前後ハイフン除去は別途行う。

/[^a-z0-9]+/g
文字種ひらがな・カタカナ・漢字の判定

ひらがな・カタカナ・常用的な漢字・々・長音符のみで構成されるか。

/^[\u3041-\u3096\u30A1-\u30FA\u4E00-\u9FFF\u3005\u30FC]+$/
文字種Unicodeプロパティで文字種を見る

コードポイント範囲を手書きせず、Unicodeの定義でひらがな判定する。u フラグが必須。

/^\p{Script=Hiragana}+$/u
検証⚠ 危険な例:入れ子の繰り返し(ReDoS)

書いてはいけない形の代表。繰り返しの中に繰り返しがあり、失敗時のバックトラッキングが指数的に爆発する。

/^(a+)+$/

コピペ前に思い出したい3つ

  • 正規表現は「形式」しか見ない:日付の形が合っていても2月30日は通る。メールの形が合っていても届くとは限らない。実在確認は別の手段で。
  • 構造のあるものをパースしない:HTML・JSON・CSVは専用パーサへ。正規表現でのHTML処理はサニタイズ目的だと脆弱性になる。
  • 入れ子の繰り返しを書かない(a+)+ 型はReDoSで固まる。ユーザー入力に当てる式は特に。