正規表現(RegExp)は、文字列のパターンマッチングを行うための強力な機能です。入力バリデーション、文字列の検索・置換、データの抽出など、テキスト処理で幅広く活用されます。JavaScriptではRegExpオブジェクトまたはリテラル記法で使用します。
基本的な使い方
正規表現は/パターン/フラグのリテラル記法、またはnew RegExp()で作成します。
JavaScript
// リテラル記法
const pattern1 = /hello/;
// RegExpコンストラクタ(動的パターン向き)
const keyword = "hello";
const pattern2 = new RegExp(keyword, "i");
// test() - マッチするかどうかの判定
console.log(/JavaScript/.test("I love JavaScript"));
console.log(/Python/.test("I love JavaScript"));
// match() - マッチ結果を取得
const result = "hello world hello".match(/hello/g);
console.log(result);
// フラグの種類
console.log(/hello/i.test("Hello")); // i: 大文字小文字を無視
console.log("a1b2c3".match(/[0-9]/g)); // g: 全件マッチ
console.log("line1\nline2".match(/^line/gm)); // m: 複数行モード実行結果
true
false
["hello", "hello"]
true
["1", "2", "3"]
["line", "line"]よく使うパターン
正規表現の基本的な記法とよく使うパターンを紹介します。
JavaScript
// メタ文字
console.log(/\d+/.test("abc123")); // \d: 数字
console.log(/\w+/.test("hello")); // \w: 英数字とアンダースコア
console.log(/\s/.test("hello world")); // \s: 空白文字
// 量指定子
console.log("color colour".match(/colou?r/g)); // ?: 0回または1回
console.log("12 123 1234".match(/\d{3}/g)); // {3}: ちょうど3回
console.log("abc".match(/[a-z]+/)); // +: 1回以上
// 文字クラス
console.log("abc123".match(/[a-zA-Z]+/g)); // 英字のみ
console.log("abc123".match(/[0-9]+/g)); // 数字のみ
console.log("2025-06-15".match(/[^-]+/g)); // ハイフン以外
// アンカー
console.log(/^Hello/.test("Hello World")); // ^: 先頭
console.log(/World$/.test("Hello World")); // $: 末尾
// グループとキャプチャ
const dateStr = "2025-06-15";
const dateMatch = dateStr.match(/(\d{4})-(\d{2})-(\d{2})/);
console.log("年:", dateMatch[1]);
console.log("月:", dateMatch[2]);
console.log("日:", dateMatch[3]);実行結果
true
true
true
["color", "colour"]
["123", "123"]
["abc"]
["abc"]
["123"]
["2025", "06", "15"]
true
true
年: 2025
月: 06
日: 15実践的な活用例
入力バリデーション、文字列の置換、データ抽出の実例を紹介します。
JavaScript
// メールアドレスの簡易バリデーション
function isValidEmail(email) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
}
console.log(isValidEmail("user@example.com"));
console.log(isValidEmail("invalid-email"));
// 電話番号のフォーマット
function formatPhone(phone) {
const cleaned = phone.replace(/\D/g, ""); // 数字以外を除去
return cleaned.replace(/(\d{3})(\d{4})(\d{4})/, "$1-$2-$3");
}
console.log(formatPhone("09012345678"));
console.log(formatPhone("090-1234-5678"));
// URLからパラメータを抽出
const url = "https://example.com/search?q=javascript&page=2&lang=ja";
const params = {};
url.replace(/[?&]([^=]+)=([^&]*)/g, (_, key, value) => {
params[key] = decodeURIComponent(value);
});
console.log(params);
// HTMLタグの除去
const html = "<p>こんにちは<strong>世界</strong></p>";
const textOnly = html.replace(/<[^>]*>/g, "");
console.log(textOnly);実行結果
true
false
090-1234-5678
090-1234-5678
{ q: "javascript", page: "2", lang: "ja" }
こんにちは世界名前付きキャプチャグループ
ES2018以降では(?<name>パターン)で名前付きキャプチャグループが使えます。"2025-06-15".match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/).groupsで{ year: "2025", month: "06", day: "15" }が取得できます。
注意点
正規表現は強力ですが、複雑になると可読性が大きく低下します。パフォーマンスにも影響する場合があります(特にバックトラッキングが多いパターン)。単純な文字列操作にはincludes()やstartsWith()を使い、正規表現は本当に必要な場面で使いましょう。
まとめ
- 正規表現は
/パターン/フラグのリテラル記法で作成 test()で判定、match()でマッチ結果を取得gフラグで全件マッチ、iフラグで大文字小文字無視- バリデーション、フォーマット変換、データ抽出に活用
- 複雑なパターンは可読性とパフォーマンスに注意