正規表現は「難しい」と感じている人は多いのではないでしょうか。
私自身、初めて見た時は意味が分からなすぎて何も頭に入ってきませんでした。
しかし、実は正規表現でよく使うパターンは意外と少なく、10個覚えるだけで実務の大半は対応できます。
この記事では、コピペで使える実践的なパターンだけを集めました。複雑な理論は抜きにして、「これが欲しかった」というパターンばかりです。
1. メールアドレスの妥当性チェック
const emailRegex = /^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
console.log(emailRegex.test("user@example.com")); // true
console.log(emailRegex.test("invalid.email@")); // false
console.log(emailRegex.test("test@domain.co.jp")); // true
何をしているか : メールアドレスとして一般的な形式かどうかをチェックしています。
補足 完全に正確なメール検証が必要な場合は、本来はメール送信確認が最も確実な検証方法です。実務ではこのシンプル版でほぼほぼ問題ありません。
2. 電話番号(日本)のフォーマット
const phoneRegex = /^0\d{1,4}-?\d{1,4}-?\d{4}$/;
console.log(phoneRegex.test("090-1234-5678")); // true
console.log(phoneRegex.test("09012345678")); // true
console.log(phoneRegex.test("03-1234-5678")); // true
console.log(phoneRegex.test("1234-5678")); // false
何をしているか : 最初の「0」から始まる日本の電話番号形式をチェックしています。ハイフンの有無どちらでも対応しています。
3. URLの抽出
const urlRegex = /https?:\/\/[^\s)]+/g;
const text = "詳しくはhttps://example.com と https://sample.co.jp/page を見てください";
const urls = text.match(urlRegex);
console.log(urls); // ["https://example.com", "https://sample.co.jp/page"]
何をしているか : テキストから「http」または「https」で始まるURLを全て抽出します。gフラグを使うことで、文章中に複数あるURLもまとめて取得できます。
4. HTMLタグの削除
const htmlRegex = /<[^>]*>/g;
const text = "<p>こんにちは</p><strong>世界</strong>";
const cleaned = text.replace(htmlRegex, "");
console.log(cleaned); // "こんにちは世界"
何をしているか : < と > に囲まれたタグをすべて削除しています。表示用テキストとして、タグだけを取り除きたい場合に使えます。
補足 複雑なHTMLの解析にはDOMParserを使った方が安全です。ただしシンプルなタグ削除だけならこれで十分です。
5. 数字だけを抽出
const numberRegex = /\d+/g;
const text = "商品コードABC123def456GHI789";
const numbers = text.match(numberRegex);
console.log(numbers); // ["123", "456", "789"]
何をしているか : \d は「0〜9の数字」を意味します。+ は「1文字以上連続した」という意味なので、連続する数字をまとめて抽出します。
6. スペース(空白)の検出と統一
const spaceRegex = /\s+/g;
const text = " こんにちは 世界 World ";
const cleaned = text.replace(spaceRegex, " ");
console.log(cleaned); // " こんにちは 世界 World "
何をしているか : \s は「スペース、タブ、改行」などのあらゆる空白文字を意味します。複数の空白をまとめて1つに統一できます。(ここでは半角スペース1つに統一しています)
7. 郵便番号(日本)のフォーマット
const postalCodeRegex = /^\d{3}-\d{4}$/;
console.log(postalCodeRegex.test("100-0001")); // true
console.log(postalCodeRegex.test("1000001")); // false
console.log(postalCodeRegex.test("100-001")); // false
何をしているか : 日本の郵便番号形式「XXX-XXXX」(3桁-4桁)を正確にチェックしています。
8. キャメルケースとスネークケースの相互変換
// キャメルケースをスネークケースに
const camelToSnake = (str) => str.replace(/[A-Z]/g, (m) => "_" + m.toLowerCase());
console.log(camelToSnake("getUserData")); // "get_user_data"
// スネークケースをキャメルケースに
const snakeToCamel = (str) => str.replace(/_([a-z])/g, (m, c) => c.toUpperCase());
console.log(snakeToCamel("get_user_data")); // "getUserData"
何をしているか : [A-Z] で大文字をキャッチし、置換時に小文字に変換したアンダースコア付きで置き換えています。
9. 特殊文字の検出
const specialCharRegex = /[^a-zA-Z0-9]/;
console.log(specialCharRegex.test("password123")); // false
console.log(specialCharRegex.test("pass@word!")); // true
何をしているか : 英数字以外の文字(記号や記述文字など)が含まれているかをチェックします。パスワード強度検証などに使えます。
10. 連続する同じ文字を検出
const duplicateRegex = /(.)\1{2,}/;
console.log(duplicateRegex.test("aaa")); // true
console.log(duplicateRegex.test("hello")); // false
console.log(duplicateRegex.test("bookkeeper")); // true
何をしているか : (.) で任意の1文字をキャッチして \1 で同じ文字を参照します。{2,} は「同じ文字がさらに2回以上続く」、つまり3文字以上の連続を意味します。
これだけは知っておこう! 正規表現の基礎知識
| 記号 | 意味 | 例 |
|---|---|---|
. |
任意の1文字 |
a.b は「aXb」にマッチ |
* |
0回以上の繰り返し |
ab*c は「ac」「abc」「abbc」 |
+ |
1回以上の繰り返し |
ab+c は「abc」「abbc」(「ac」は×) |
? |
0回または1回 |
ab?c は「ac」「abc」 |
^ |
行頭 |
^abc は「abc」で始まる行 |
$ |
行末 |
abc$ は「abc」で終わる行 |
[] |
範囲指定 |
[a-z] は小文字1文字 |
\d |
数字(0〜9) |
\d+ は「123」 |
\w |
単語文字 |
\w+ は「abc123」 |
\s |
空白文字 |
\s+ は複数のスペース |
() |
グループ化 |
(ab)+ は「ab」の繰り返し |
\1 |
グループの参照 | 同じ文字列を再度マッチ |
こんな時は正規表現を避けるべき
正規表現は便利ですが、すべての場面で最適とは限りません。
- 複雑なHTML解析 → DOMParser、jsdomなどを使用
- URL解析 → URLオブジェクトを使用
- 複雑なJSON検証 → JSONスキーマ(Ajvなど)を使用
- 複雑な日付チェック → date-fnsやmomentなどのライブラリを使用
正規表現は「シンプルで目的が明確」な場合が得意です。複雑になったら専門のライブラリ利用も検討しましょう。
まとめ
特に長い正規表現の場合、まったく意味がわからない呪文のように見えることは多々あります。
しかしながら、正規表現は「よくあるパターンの組み合わせ」に過ぎません。この10個を使い回すだけで、実務のほとんどの場面に対応できます。
まずはこのページをブックマークして、必要な時に「あ、このパターンはどう書くんだっけ」という時に参照してください。何度も使っていれば、自然と覚えます!