【JavaScript入門】正規表現

 Web ページの開発やデータ処理をしていると、文字列を詳細に検索したり、特定のパターンで置換する機会が多く発生します。その際に非常に便利なのが 正規表現 (RegExp) です。JavaScript には正規表現が組み込まれており、検索や置換を簡単に行えます。ここでは、JavaScript の正規表現リテラルやフラグ、代表的なメタ文字(特殊記号)の意味を解説します。

1.正規表現とは

 文字列の並びを記号を用いてパターン化し、そのパターンに文字列が当てはまるかを調べたり、合致する部分を置換する手法を指します。JavaScript では、正規表現リテラル/パターン/フラグ)または RegExp オブジェクトnew RegExp('パターン', 'フラグ'))として記述できます。通常はリテラルを使い、動的にパターンを生成したい場合に new RegExp() を選ぶことが多いです。

2.正規表現の記法とフラグ

2.1.代表的なメタ文字(特殊記号)

記号説明
^a文字列先頭に a。m フラグがあるときは行頭。
a$文字列末尾に a。m フラグがあるときは行末。
.任意の1文字(改行は含まない)。
a?a が 0回 or 1回。
a+a を 1回以上、できるだけ多く一致(最長一致)。
a*a を 0回以上、できるだけ多く一致(最長一致)。
a+?a を 1回以上、できるだけ少なく(最短一致)。
a*?a を 0回以上、できるだけ少なく(最短一致)。
a{n}a をちょうど n回。
a{n,}a を n回以上。
a{n1,n2}a を n1~n2回の範囲で繰り返す。
[abc]a or b or c の任意の1文字。
[^abc]a, b, c 以外の任意の1文字。
[A-C]角括弧内の連続範囲 A ~ C の任意の1文字。
[^A-C]連続範囲 A ~ C 以外の任意の1文字。
\n改行。
\d数字 ([0-9]) と同じ。
\D数字以外 ([^0-9]) と同じ。
\w英数字とアンダースコア ([A-Za-z0-9_]) と同じ。
\W英数字とアンダースコア以外 ([^A-Za-z0-9_]) と同じ。
`abcdef`
`a(bcde)f`

2.2.フラグ

フラグ説明
gglobal。すべての一致箇所を検索する。
iignoreCase。大文字・小文字を区別せずに検索する。
mmultiline。^$ が行頭・行末にマッチするようになる(複数行テキストの各行を対象)。
sdotAll。. が改行文字にもマッチする(ES2018 で導入)。

3.サンプルコード

 以下を「myRegExpExample.html」というファイル名で保存し、ブラウザで開発者ツールのコンソールをチェックしてください。

【myRegExpExample.html】

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>myRegExpExample.html</title>
</head>
<body>
  <h1>正規表現のサンプル</h1>
  <p>開発者ツールのコンソールで出力を確認してください。</p>

  <script>
    // 1) 正規表現リテラルを使った検索例
    console.log('=== 正規表現リテラル ===');
    const text = 'JavaScriptは、scriptを大文字小文字を区別せず探すことができます。';
    // /script/i : "script" (大文字小文字無視)
    const pattern = /script/i;

    // matchで検索結果を確かめる
    const result = text.match(pattern);
    console.log('検索対象:', text);
    console.log('正規表現:', pattern);
    console.log('マッチ結果:', result);

    // 2) new RegExp() で動的に作成
    console.log('=== new RegExp() ===');
    const dynamicString = 'HELLO';
    // フラグなしで"HELLO"を探すパターンを動的生成
    const dynamicPattern = new RegExp(dynamicString);
    const dynamicResult = 'hello HELLO Hello'.match(dynamicPattern);
    console.log('検索対象: "hello HELLO Hello"');
    console.log('動的正規表現:', dynamicPattern);
    console.log('マッチ結果:', dynamicResult);

    // 3) 複数マッチ (フラグ g) の例
    console.log('=== フラグg (global) ===');
    const text2 = 'Apple apple AAA aPple aPPle';
    // "apple" を大小文字区別しないで探し、全マッチを取得
    const patternG = /apple/gi;
    console.log('検索対象:', text2);
    console.log('マッチ結果:', text2.match(patternG));

    // 4) メタ文字の例: 数字だけにマッチ
    console.log('=== メタ文字 (\\d) の例 ===');
    const numericPattern = /\d+/g; // 1回以上の数字
    const text3 = '商品番号: A123, 値段: 450, 在庫数: 25個';
    const foundNumbers = text3.match(numericPattern);
    console.log('検索対象:', text3);
    console.log('数字の抽出:', foundNumbers);

    // 5) 置換の例: replace() でフラグ g を使うと全て置換
    console.log('=== replace() と正規表現 ===');
    const replacePattern = /[A-Z]/g; // 大文字アルファベットを探す
    const replacedText = text3.replace(replacePattern, '[英字]');
    console.log('置換前:', text3);
    console.log('置換後:', replacedText);
  </script>
</body>
</html>

デバックコンソールの出力

=== 正規表現リテラル ===
検索対象: JavaScriptは、scriptを大文字小文字を区別せず探すことができます。
正規表現: /script/i
マッチ結果: (1) ['Script', index: 4, input: 'JavaScriptは、scriptを大文字小文字を区別せず探すことができます。', groups: undefined]
=== new RegExp() ===
検索対象: "hello HELLO Hello"
動的正規表現: /HELLO/
マッチ結果: (1) ['HELLO', index: 6, input: 'hello HELLO Hello', groups: undefined]
=== フラグg (global) ===
検索対象: Apple apple AAA aPple aPPle
マッチ結果: (4) ['Apple', 'apple', 'aPple', 'aPPle']
=== メタ文字 (\d) の例 ===
検索対象: 商品番号: A123, 値段: 450, 在庫数: 25個
数字の抽出: (3) ['123', '450', '25']
=== replace() と正規表現 ===
置換前: 商品番号: A123, 値段: 450, 在庫数: 25個
置換後: 商品番号: [英字]123, 値段: 450, 在庫数: 25個

まとめ

  • 正規表現は、文字列の検索・置換で強力な機能を提供する。
  • JavaScript では /正規表現/フラグ のリテラルか、new RegExp('パターン', 'フラグ') で記述。
  • フラグには g(全て検索)、i(大文字小文字無視)、m(複数行対応)、s(dotAll)などがある。
  • メタ文字を使うことで、繰り返しや範囲、行頭行末などを表現できる。
  • .match(), .search(), .replace(), .split() などの String メソッドを正規表現と組み合わせると、より柔軟な文字列処理が可能。

 このように正規表現を覚えておくと、入力のバリデーションやテキスト解析、高度な検索置換などさまざまな場面で役に立つでしょう。