組み込み関数

JavaScriptの正規表現入門|パターンマッチングの基本と実践

正規表現(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フラグで大文字小文字無視
  • バリデーション、フォーマット変換、データ抽出に活用
  • 複雑なパターンは可読性とパフォーマンスに注意