regExp.global vs while ループ vs matchAll メソッド

2024-04-02

JavaScript の RegExp における regExp.global プロパティ

regExp.global プロパティは、正規表現オブジェクト (RegExp) の動作に影響を与えるフラグです。このフラグを設定すると、正規表現パターンが 複数回 一致するかどうかが変わります。

デフォルト動作

デフォルトでは、regExp.globalfalse に設定されています。つまり、正規表現パターンは 最初に見つかった箇所のみ 一致します。

以下のコードでは、str 変数内の "a" という文字が 最初に見つかった箇所のみ 一致し、match 変数には "a" が格納されます。

const str = "abcda";
const re = /a/;
const match = re.exec(str);

console.log(match); // ["a", index: 0, input: "abcda"]

regExp.global を true に設定

regExp.globaltrue に設定すると、正規表現パターンが すべての箇所 一致するようになります。

以下のコードでは、str 変数内の "a" という文字が すべての箇所 一致し、match 変数には ["a", "a", "a"] が格納されます。

const str = "abcda";
const re = /a/g;
const match = re.exec(str);

console.log(match); // ["a", "a", "a", index: 0, input: "abcda"]

注意点

  • regExp.globaltrue に設定すると、ループ処理が発生するため、処理速度が遅くなる可能性があります。
  • 複数回一致するパターンを処理する場合は、lastIndex プロパティも考慮する必要があります。

補足

  • regExp.global は、exec() メソッドだけでなく、test() メソッドや replace() メソッドなどの他の RegExp メソッドにも影響を与えます。
  • regExp.global は、正規表現リテラルでも設定できます。

const re = /a/g;
const str = "abcda";

console.log(re.test(str)); // true
console.log(str.replace(re, "-")); // "-bcd-"


JavaScript RegExp の regExp.global プロパティを使ったサンプルコード

複数回のマッチ

const str = "abcda";
const re = /a/g;

let match;
while ((match = re.exec(str)) !== null) {
  console.log(match.index);
}

出力結果:

0
1
3

特定のパターンをすべて置換

以下のコードは、str 変数内の "123" という文字列を すべて "456" に置換します。

const str = "abc123def123ghi";
const re = /123/g;

const newStr = str.replace(re, "456");

console.log(newStr); // abc456def456ghi

複数行にわたるマッチ

以下のコードは、str 変数内の複数行にわたって "abc" という文字列を すべて マッチし、その内容を出力します。

const str = `abc
def
abc
ghi`;
const re = /abc/g;

let match;
while ((match = re.exec(str)) !== null) {
  console.log(match[0]);
}

出力結果:

abc
abc

グループ化と置換

以下のコードは、str 変数内の電話番号を すべて マッチし、ハイフンで区切った形式に変換します。

const str = "電話番号: 090-1234-5678\n" +
            "メールアドレス: [email protected]\n" +
            "電話番号: 080-9876-5432";
const re = /電話番号:\s+(\d{3}-\d{4}-\d{4})/g;

const newStr = str.replace(re, "電話番号: $1");

console.log(newStr);

出力結果:

電話番号: 090-1234-5678
メールアドレス: [email protected]
電話番号: 080-9876-5432


JavaScript で複数回マッチする方法

while ループを使って、exec() メソッドを繰り返し呼び出す方法です。

const str = "abcda";
const re = /a/;

let match;
while ((match = re.exec(str)) !== null) {
  // マッチした内容を処理
  console.log(match[0]);
}

出力結果:

a
a
a

matchAll() メソッド

matchAll() メソッドは、正規表現パターンが すべて 一致する箇所をイテレータとして返します。

const str = "abcda";
const re = /a/g;

const matches = str.matchAll(re);

for (const match of matches) {
  // マッチした内容を処理
  console.log(match[0]);
}

出力結果:

a
a
a

replace() メソッド

replace() メソッドは、正規表現パターンに一致する箇所を すべて 置換することができます。

const str = "abc123def123ghi";
const re = /123/g;

const newStr = str.replace(re, "456");

console.log(newStr); // abc456def456ghi

ライブラリの使用

RegExLib などのライブラリを使うと、より複雑なパターンマッチングを簡単に実行できます。

const str = "abcda";
const re = /a/g;

const matches = RegExLib.FindAll(str, re);

for (const match of matches) {
  // マッチした内容を処理
  console.log(match);
}

出力結果:

{
  "index": 0,
  "input": "abcda",
  "groups": []
}
{
  "index": 1,
  "input": "abcda",
  "groups": []
}
{
  "index": 3,
  "input": "abcda",
  "groups": []
}

各方法の比較

方法メリットデメリット
regExp.globalシンプル処理速度が遅くなる可能性がある
while ループ柔軟性が高いコードが冗長になる
matchAll() メソッド簡潔古いブラウザでは使用できない
replace() メソッド置換に便利パターンマッチングのみには不向き
ライブラリ複雑なパターンマッチングに便利ライブラリの読み込みが必要

どの方法を使うかは、状況によって異なります。 シンプルなパターンマッチングの場合は regExp.globalwhile ループが使いやすく、複雑なパターンマッチングの場合は matchAll メソッドやライブラリを使うと便利です。




JavaScript RegExp.lastParen を使いこなす:複雑なパターンマッチングをマスター

概要RegExp オブジェクトの静的プロパティ最後に一致した部分文字列のうち、最も外側の括弧で囲まれた部分を取得別名: RegExp["+"]∗使用例:∗複雑なパターンマッチングの結果を処理∗抽出した部分文字列を再利用∗マッチング結果の検証∗∗詳細∗∗∗∗∗値∗∗:∗最後に一致した部分文字列のうち、最も外側の括弧で囲まれた部分∗一致がない場合:空文字列∗複数回のマッチング:最後のマッチング結果∗∗∗更新タイミング∗∗:∗RegExpオブジェクト(サブクラスではない)がマッチングに成功するたびに更新∗括弧で囲まれたキャプチャグループが存在する場合のみ更新∗∗∗アクセス方法∗∗:∗RegExp



JavaScript RegExp オブジェクトの source プロパティ

source プロパティ は、RegExp オブジェクトのプロパティの一つで、正規表現のパターン文字列を取得するために使用されます。例:この例では、regExp という RegExp オブジェクトを作成し、source プロパティを使用して、そのオブジェクトのパターン文字列 "ab+c" を取得しています。


String.rawを使いこなして、テンプレートリテラルをマスターしよう!

テンプレートリテラルとは?従来の文字列リテラルとは異なり、複数行にわたって記述でき、変数や式を埋め込むことができる文字列です。String. rawの役割テンプレートリテラルでは、エスケープシーケンス(例:\n)は改行文字などに変換されます。しかし、String


String.italics() メソッド:HTML要素内の文字列を斜体表示

使い方このメソッドは、次のように使用できます。この例では、"これは斜体です。" という文字列が myElement 要素内に <i> タグで囲まれて挿入されます。その結果、その文字列は斜体で表示されます。注意点String. italics() メソッドは、HTML を生成するものであり、プレーンなテキストを斜体にするものではありません。


JavaScriptでアンカー要素を簡単作成!Stringオブジェクトのanchor()メソッド徹底解説

構文:引数:name: アンカーの名前を表す文字列。省略可能。省略された場合は、空文字列("")が使用されます。戻り値:アンカー要素を含む新しい文字列。この例では、str変数に格納された文字列 "Hello, world!" に "greeting" という名前のアンカー要素を追加し、新しい文字列 anchoredStr に格納しています。



JavaScriptで文字列処理を安全に行う:normalizeメソッドの理解と使いこなし

string. normalize() メソッドは、文字列を Unicode 正規化形式に変換します。これは、文字列を比較したり、検索したり、処理したりする際に、文字の表現方法の違いによる問題を解決するために役立ちます。使い方string


JavaScript初心者必見!Date.setUTCMillisecondsメソッドを徹底解説

メソッドの役割Date. setUTCMillisecondsメソッドは、以下の2つの役割を担います。既存の日付時刻のミリ秒部分を変更する: すでに作成済みのDateオブジェクトに対して、ミリ秒単位で時刻を調整できます。新しい日付時刻を作成する: 引数にミリ秒値のみを渡すことで、ミリ秒単位の精度で新しいDateオブジェクトを作成できます。


String.fromCodePoint 以外にも知っておきたい、Unicodeコードポイントから文字列を作成する方法

例:使い方:String. fromCodePoint() を呼び出します。引数として、1つ以上のUnicodeコードポイントを渡します。コードポイントは10進数、16進数、または文字列リテラルで指定できます。詳細:Unicodeコードポイントは、0から1114111までの整数です。


JavaScriptの Object.seal メソッド:オブジェクトを封印する方法

概要Object. sealメソッドは、JavaScriptオブジェクトを封印するためのものです。封印されたオブジェクトは、以下の操作に対して変更を拒否します。新しいプロパティの追加既存のプロパティの削除プロパティの記述子の変更 (構成可能、書き込み可能、削除可能など)


JavaScript Arrayの階層構造を自在に操る: array.flat メソッド

array. flat メソッドは、以下の機能を提供します。配列の要素を再帰的に展開し、1つの配列に結合するオプションで、展開する深さを指定できるES2019で導入された従来の方法と比較すると、以下の利点があります。コードが簡潔になる処理速度が速い場合がある