正規表現133種
表記法からメール・日付・アドレスの検査まで。式ごとに「合うべき例」と「合ってはいけない例」を添え、検査が毎回実際に走らせます。
表記法28
1文字をどう指すかを決める表記です。ほかはすべてここから始まります。
\d数字1文字\D数字以外の文字\w英数字とアンダースコア\W英数字とアンダースコア以外\s空白1文字\S空白以外の文字^.$任意の1文字^[a-z]+$英小文字だけ^[A-Z]+$英大文字だけ^[A-Za-z0-9]+$英数字だけ^[^0-9]+$数字を含まない文字列^[가-힣]+$ハングルだけ^[ぁ-んァ-ヶー]+$かなだけ^[\u4e00-\u9fff]+$漢字だけ^a\.b$ピリオドそのもの^a/b$スラッシュそのもの\tタブ文字\n改行文字\r\nWindows形式の改行^\u00e9$コードで書いた文字^Helloこの語で始まる文字列world$この語で終わる文字列^cat$この語だけの文字列\bcat\b単語として独立している位置\Bcat単語の内側にある位置^cat$大文字小文字を区別しない一致^b各行の先頭^a.b$改行も含む任意の文字繰り返しとグループ17
何回繰り返すか、どこまでをひとまとまりと見るかを決めます。
^ab*c$0回以上^ab+c$1回以上^colou?r$あってもなくてもよい文字^\d{4}$ちょうど4桁^\d{2,4}$2桁から4桁まで^\d{2,}$2桁以上<.+?>できるだけ短く取るタグ1つ^<.+>$できるだけ長く取るひと塊^(?:cat|dog)$二つのうちどちらか^(?:ab)+$2文字のまとまりの繰り返し^(\d{3})-(\d{4})$前後二つを別々に取り出す^(?:\d{3}-)+\d{4}$まとめるだけで取り出さない^(?<year>\d{4})-(?<month>\d{2})$名前を付けて取り出す(\w)\1同じ文字が二度続くところ\b(\w+)\s+\1\b同じ語が二度続くところ^(?:https?://)?example\.com$スキームがあってもなくてもよいアドレス^(?:\d{1,3}\.){3}\d{1,3}$4つに区切られたアドレス前後を見る8
前後に何があるかを確かめるだけで、取り込みはしません。条件を重ねるときに使います。
全体の検査44
前後が固定されているので、文字列全体が合わないと通りません。入力検査に使います。
^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$メールアドレス^https?://[^\s/$.?#][^\s]*$ウェブアドレス^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$ドメイン名^(?:(?: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)$IPv4アドレス^(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$省略しないIPv6アドレス^(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}$MACアドレス^(?:6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4})$ポート番号^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$UUID^#(?:[0-9a-f]{3}|[0-9a-f]{6})$16進数のカラーコード^rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)$rgb() 形式の色^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ISO形式の日付^(?:0[1-9]|[12]\d|3[01])/(?:0[1-9]|1[0-2])/\d{4}$スラッシュ区切りの日付^(?:[01]\d|2[0-3]):[0-5]\d$24時間制の時刻^(?:0?[1-9]|1[0-2]):[0-5]\d\s?(?:am|pm)$午前・午後付きの時刻^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$ISO形式の日時^P(?=\d|T\d)(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$ISO形式の期間^\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?(?:\+[0-9a-z.-]+)?$セマンティックバージョン番号^\d+$符号なしの整数^[+-]?\d+$符号が付きうる整数^-?\d+(?:\.\d+)?$小数点が付きうる数^-?\d+(?:\.\d+)?[eE][+-]?\d+$指数表記の数^(?:100(?:\.0+)?|\d{1,2}(?:\.\d+)?)%$0から100までの百分率^\d{1,3}(?:,\d{3})*$3桁ごとにカンマを打った数^[$€£¥₩]\s?\d{1,3}(?:,\d{3})*(?:\.\d{2})?$通貨記号の付いた金額^[0-9a-f]+$16進数の文字列^[01]+$0と1だけの文字列^[0-7]+$8進数の文字列^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$base64でエンコードした文字列^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$ドット二つで区切られたJWT^\+[1-9]\d{7,14}$国際標準の電話番号^[a-z][a-z0-9_]{2,15}$英字で始まるユーザー名^[a-z0-9]+(?:-[a-z0-9]+)*$URLに使う語のつなぎ^[^\\/:*?"<>|]+\.[a-z0-9]+$拡張子付きのファイル名^.+\.(?:jpe?g|png|gif|webp|avif|svg)$画像ファイルの拡張子^/(?:[^/\0]+/)*[^/\0]*$UNIX形式のパス^[A-Za-z]:\\(?:[^\\/:*?"<>|]+\\)*[^\\/:*?"<>|]*$Windows形式のパス^</?[a-z][a-z0-9]*(?:\s[^<>]*)?/?>$HTMLタグ1つ^\.-?[_a-z][_a-z0-9-]*$CSSのクラスセレクタ^M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})$ローマ数字^-?(?:90(?:\.0+)?|[1-8]?\d(?:\.\d+)?)$緯度の値^-?(?:180(?:\.0+)?|1[0-7]\d(?:\.\d+)?|\d{1,2}(?:\.\d+)?)$経度の値^(?:0|[1-9]\d*)$先頭に0が付かない数^\d*[02468]$偶数^\s*$空行取り出しと整形36
文の中から必要な部分だけを取り出したり消したりするときに使います。
\s+$行末に残った空白^\s+行頭の空白^\s+|\s+$前後の空白\s{2,}2つ以上続く空白\n\s*\n行間の空行\D+数字でない部分[^\x00-\x7F]ASCII以外の文字[\x00-\x1F]目に見えない制御文字</?[^>]+>文中のHTMLタグ<!--[\s\S]*?-->HTMLのコメント//.*$スラッシュ2つで始まるコメント/\*[\s\S]*?\*/複数行にわたるコメント"[^"\\]*(?:\\.[^"\\]*)*"二重引用符で囲んだ部分'[^'\\]*(?:\\.[^'\\]*)*'単一引用符で囲んだ部分\[([^\]]+)\]\(([^)]+)\)Markdownのリンク^#{1,6}\s+.+$Markdownの見出し行(?:^|\s)#([a-z0-9_]+)ハッシュタグ(?:^|\s)@([a-z0-9_]{2,})@付きのメンション[?&]([^=&]+)=([^&]*)URLのクエリパラメータhttps?://[^\s<>"]+文中に混じったURL^https?://([^/:?#]+)URLからドメインだけ\.([a-z0-9]+)$ファイル名の拡張子(?<=[a-z0-9])(?=[A-Z])キャメルケースの語の切れ目_([a-z])アンダースコアの次の文字-([a-z])ハイフンの次の文字(?:^|,)("(?:[^"]|"")*"|[^,]+)カンマで区切られた1項目^([^=]+)=(.*)$等号で分けた名前と値^\s*(\S+)最初の語(\S+)\s*$最後の語\d+文中の数字のかたまり\b\w+\b語を一つずつ\[([^\]]*)\]角かっこの中身\(([^)]*)\)かっこの中身[\uD800-\uDBFF][\uDC00-\uDFFF]2つ分を占める絵文字(.)\1{2,}同じ文字が3回以上,\s*([}\]])閉じかっこ前に残ったカンマ読み方
- 前後に ^ と $ があれば文字列全体が合う必要があります。なければ文中のどこでも構いません。入力検査に使う式には必ず付けてください。
- かっこ ( ) は中身を取り出します。まとめるだけでよいときは (?: ) と書けば、後ろのグループ番号がずれません。
- ここに載せた式はすべて例と突き合わせて検査しています。ただし「メールの形をしている」ことと「実在する宛先」であることは別の話です。
- 終わりの決まっていない繰り返しが入れ子になると((a+)+ など)、入力によって時間が爆発することがあります。他人の式を貼る前にこの形を探してください。
よくある質問
Q. 正規表現とは何ですか。
文の中から探したい「形」を書き表す小さな言語です。「数字4つ」の代わりに \d{4} と書けば、プログラムがその形の箇所を見つけてくれます。JavaScript・Python・Java などほとんどの言語がほぼ同じ表記を使います。
Q. メールの検査式はなぜこんなに短いのですか。
規格を全部反映した式は数千文字になり、それでも実在する宛先かはわかりません。打ち間違いを弾くのが正規表現にできることで、本当の確認は確認メールを送ることだけです。
Q. なぜ言語ごとに式が少し違うのですか。
骨格は同じでも細部が違います。JavaScript には \A がなく、Python は re.MULTILINE を別に立てます。ここに載せた式は JavaScript でそのまま動く形で書いています。
Q. 式が遅くなることがあるとはどういう意味ですか。
(a+)+ のように終わりの決まらない繰り返しが入れ子になると、合わない入力で戻って試す組み合わせが爆発します。短い文字列でも数秒かかることがあり、サーバーでは危険です。
Q. ここに載せた式は信じてよいですか。
式ごとに「合うべき例」と「合ってはいけない例」を持たせ、検査が133個すべてを実際に走らせています。画面に見える例がそのまま検査に使う例なので、説明と式が食い違ったまま残ることはありません。