トップページに戻る

Javascript 正規表現

  1. RegExp(正規表現)作成方法: リテラル表記:
    ・ コードが簡潔で、特に固定パターンを使う場合に便利
    ・ エスケープが必要な文字列(例:\)も書きやすい
    const text = "hello world";
    const result = text.match(/hello/);
    console.log(result[0]); // "hello"
    フラグ:
    • g: グローバル検索(すべての一致を見つける)
    • i: 大文字小文字を区別しない
    • m: 複数行モード
    • 例: /hello/gi
  2. 特殊文字
    . 改行を除く任意の1文字
    [^] 改行を含む任意の1文字
    ^ 入力の先頭
    $ 入力の末尾
    * 直前のパターンの0回以上の繰り返し
    + 直前のパターンの1回以上繰り返し
    ? 直前のパターンが0回または1回の場合
    {n} 直前のパターンの n 回 繰り返し
    n,} 直前のパターンの n 回以上の繰り返し
    {n,m} 直前のパターンの n 回以上 m 回以下の繰り返し
    ? (量指定子後) 最小マッチ
    ` ` 複数の選択肢(`A B` は A または B にマッチ)
    ( ) グループ化、キャプチャ
    (?: ) 非キャプチャグループ(マッチするがキャプチャしない)
    \ 次の文字をエスケープ
     
  3. エスケープシーケンス
    \d 数字([0-9]
    \D 数字以外([^0-9]
    \w 単語文字([a-zA-Z0-9_]
    \W 単語文字以外([^a-zA-Z0-9_]
    \s 空白文字(スペース、タブ、改行など)
    \S 空白文字以外
    \b 単語境界
    \B 単語境界以外
    \n 改行文字
    \r キャリッジリターン (行頭復帰)
    \t タブ文字
    \0 NULL文字
  4. RegExp(正規表現)作成方法: RegExpオブジェクト
    ・ 動的に正規表現を作成する場合に便利
    ・ たとえば、変数や文字列をパターンとして使用できる
    const text = "hello world";
    const regex = new RegExp("hello");
    const result = text.match(regex);
    console.log(result[0]); // "hello"
    フラグ:
    • s: dot-allモード。 . が改行文字にもマッチする
    • g: グローバル検索(すべての一致を見つける)
    • i: 大文字小文字を区別しない
    • m: 複数行モード
    • u: Unicode文字を正しく扱う
    • y: 現在の位置からのみマッチを試みる
    const regex = new RegExp("hello", "g");
     
  5. • 文字列置換: replace
    • パターン分割: split
    • すべての一致取得: matchAll
    • 一致確認: test
    • 一致詳細取得: exec
    • 一致位置取得: search
     
  6. match メソッド
    String.prototype.match() は、文字列に正規表現を適用して一致する部分を取得します。
    基本構文:
    const result = string.match(pattern);
    戻り値:
    • gフラグあり: 一致した全体の文字列を配列で返します。
    • gフラグなし: 最初の一致情報(キャプチャグループ含む)を配列で返します。
    • 一致がない場合はnullを返します。
    例:
    const text = "hello world, hello JavaScript";
    const regex = /hello/g;

    const matches = text.match(regex);
    console.log(matches); // ["hello", "hello"]

    const nonGlobalRegex = /hello/;
    const firstMatch = text.match(nonGlobalRegex);
    console.log(firstMatch[0]); // "hello"
    console.log(firstMatch.index); // 0 (最初の一致位置)
     
  7. search メソッド
    String.prototype.search() は、文字列に正規表現を適用し、最初に一致した位置を返します。
    基本構文:
    const index = string.search(pattern);
    戻り値:
    • 最初に一致した部分の開始位置を返します。
    • 一致がない場合は-1を返します。
    例:
    javascript
    const text = "hello world, hello JavaScript";
    const regex = /hello/;

    const index = text.search(regex);
    console.log(index); // 0 (最初の "hello" の位置)

    const noMatch = text.search(/python/);
    console.log(noMatch); // -1 (一致なし)
     
  8. キャプチャグループ:
    const text = "function foo() {}";
    const regex = /function (\w+)\(\)/;
    const result = text.match(regex);
    console.log(result[1]); // "foo" (キャプチャされた関数名)
     
    gフラグとキャプチャの注意点:
    ・ g フラグを付けるとキャプチャグループが配列に含まれない
    ・ 詳細情報が必要な場合は g を省略する
     
  9. replace
    文字列内の一部を置換する
    • 正規表現を使用することで、パターンマッチングした部分を置換できる
    • g フラグを使用すると、すべての一致部分を置換する
    • 置換にはコールバック関数を使うことも可能
    例:
    const text = "hello world, hello JavaScript";
    const replaced = text.replace(/hello/g, "hi");
    console.log(replaced); // "hi world, hi JavaScript"

    // コールバック関数で処理
    const replacedCallback = text.replace(/(hello)/g, (match) => {
      return match.toUpperCase();
    });
    console.log(replacedCallback); // "HELLO world, HELLO JavaScript"
     
  10. split
    文字列を指定したパターンで分割し、配列を生成する
    • 正規表現を使用することで、特定のパターンに基づいて分割できる
    例:
    const text = "apple, banana, cherry";
    const parts = text.split(/,\s*/);
    console.log(parts); // ["apple", "banana", "cherry"]
     
  11. matchAll
    正規表現で文字列内のすべての一致を反復的に取得する。g フラグが必要
    • キャプチャグループを含む詳細なマッチ情報を提供します。
    • matchAll はイテレーターを返すため、for...of ループやスプレッド構文で利用します。
    例:
    const text = "a1b2c3";
    const regex = /(\w)(\d)/g; // 文字と数字のペアをキャプチャ
    const matches = text.matchAll(regex);

    for (const match of matches) {
    console.log(match[0]); // "a1", "b2", "c3"
    console.log(match[1]); // "a", "b", "c" (キャプチャグループ1)
    console.log(match[2]); // "1", "2", "3" (キャプチャグループ2)
    }
     
  12. matchAllとmatch関数の違い
    match:
    ・ match はシンプルで早いが、キャプチャグループを得るには g フラグを付けない必要がある
    ・ 単純なマッチング結果が必要なとき(例えば一致部分の配列だけが必要)。
    ・ グローバル一致が不要で、最初の一致とキャプチャグループだけ使う場合。
     
    matchAll:
    • matchAll は詳細で柔軟性が高く、キャプチャグループも利用可能だが、少し複雑な処理になる。
    ・ 一致結果をすべて取得し、キャプチャグループや一致の位置(index)を含む詳細なデータが必要なとき。
    ・ イテレーターの利点を活かしたループ処理を行いたい場合。
     
    1. match の挙動
    String.prototype.match() は、文字列内の一致を検索し、以下のように動作する。
    • g フラグが ない場合: 最初の一致(キャプチャグループを含む)だけを返します。
    • g フラグが ある場合: 一致した部分文字列だけを配列で返し、キャプチャグループは含みません。
    match の例
    const text = "abc123abc456";
    const regex = /\d+/g;

    // g フラグあり:すべての一致を配列で返す
    const result = text.match(regex);
    console.log(result); // ["123", "456"]

    // g フラグなし:最初の一致情報を配列で返す
    const regexWithoutG = /(\d+)/;
    const resultWithGroups = text.match(regexWithoutG);
    console.log(resultWithGroups);
    // ["123", "123"]
    // resultWithGroups[1] -> "123" (キャプチャグループ)
     
    2. matchAll の挙動
    String.prototype.matchAll() は、常にすべての一致結果を取得し、さらにキャプチャグループを含む詳細な情報を提供する。g フラグが必要。
    • 戻り値は配列ではなく、イテレーターです。
    • そのため、for...of やスプレッド構文([...matches])で取り出す必要があります。
    matchAll の例
    const text = "abc123abc456";
    const regex = /(\d+)/g;

    // イテレーターを取得
    const matches = text.matchAll(regex);

    // イテレーターをループで使う
    for (const match of matches) {
    console.log(match[0]); // マッチ全体(例: "123", "456")
    console.log(match[1]); // キャプチャグループ(例: "123", "456")
    }

    // スプレッド構文で配列化
    const matchesArray = [...text.matchAll(regex)];
    console.log(matchesArray);
    // [
    // ["123", "123", index: 3, input: "abc123abc456", groups: undefined],
    // ["456", "456", index: 9, input: "abc123abc456", groups: undefined]
    // ]
     
  13. test
    正規表現に基づいて文字列に一致するかどうかを確認する
    • 一致する場合は true を、しない場合は false を返します。
    例:
    const regex = /hello/;
    console.log(regex.test("hello world")); // true
    console.log(regex.test("hi world")); // false
     
  14. exec
    正規表現の最初の一致情報を詳細に取得する
    • 一致情報(キャプチャグループを含む)を含む配列を返します。
    • グローバルフラグ g を使用すると、反復的に一致を取得できます。
    例:
    const text = "hello world";
    const regex = /(\w+) (\w+)/;
    const result = regex.exec(text);
    console.log(result[0]); // "hello world" (全体の一致)
    console.log(result[1]); // "hello" (キャプチャグループ1)
    console.log(result[2]); // "world" (キャプチャグループ2)