「パターンに合うところを全部置き換える」という発想
s.replace(/a/g, 'b') は、文字列の中で「正規表現にマッチした部分」を、まとめて別の文字列に置き換えるメソッドです。 ここでは /a/g が「置き換え対象を表すパターン」、'b' が「置き換え後の文字列」です。
天才プログラマー視点で言うと、「文字列の中の特定のパターンを一括で修正するための道具」が replace + 正規表現です。
基本イメージ:すべての「a」を「b」に変える
まずはそのままの例から。
const s = "aaa";
const t = s.replace(/a/g, "b");
console.log(t); // "bbb"
JavaScript/a/g は「文字 a にマッチする正規表現」で、g は「global(全体)」フラグです。 この g が付いていることで、文字列全体を走査して、すべての a を置き換えます。
g を付けないとどうなるかも見ておきましょう。
const s = "aaa";
const t = s.replace(/a/, "b");
console.log(t); // "baa"
JavaScriptg がない場合は、最初にマッチした 1 か所だけが置き換えられます。 「全部変えたいなら g を付ける」が、ここでの一番重要なポイントです。
正規表現を使う意味を少し深掘りする
replace は、単純な文字列でも使えます。
const s = "foo foo";
const t = s.replace("foo", "bar");
console.log(t); // "bar foo"
JavaScriptただし、この場合も「最初の 1 か所だけ」です。 「全部」をやりたいときに、正規表現+g が本領を発揮します。
さらに、正規表現を使うと「形」で指定できるようになります。
const s = "ID: 123, Code: 456";
const t = s.replace(/\d+/g, "###");
console.log(t); // "ID: ###, Code: ###"
JavaScriptここでは、\d+ が「1文字以上の数字」という意味で、 数字のかたまりを全部 "###" に置き換えています。
「この形をした部分だけ全部変えたい」という要求を、1本のパターンで書けるのが正規表現+replace の強さです。
例題:改行コードを統一する
実務でよくあるのが、「改行コードがバラバラ問題」です。 \r\n(Windows)と \n(Unix)が混ざっていると扱いづらいので、統一したくなります。
const s = "line1\r\nline2\r\nline3\n";
const t = s.replace(/\r\n/g, "\n");
console.log(t);
/*
line1
line2
line3
*/
JavaScriptここでは、 \r\n を正規表現で指定し、全部 \n に置き換えています。
「文字列の中の特定のパターンを一括で修正する」という典型的な使い方です。
置換後の文字列は「新しい文字列」であること
replace は、元の文字列を変更せず、新しい文字列を返します。
const s = "aaa";
const t = s.replace(/a/g, "b");
console.log(s); // "aaa"
console.log(t); // "bbb"
JavaScript文字列は不変(immutable)なので、 replace を呼んでも s の中身は変わりません。
この性質のおかげで、 「元の文字列を残しつつ、表示用だけ修正する」といった使い方がしやすくなります。
まとめ:s.replace(/a/g, 'b') は「パターンに合う部分を全部修正するための基本技」
replace + 正規表現を使いこなせると、 文字列の中の「特定の形をした部分」を一括で修正する処理が、驚くほど短く書けます。
/a/g のように、パターンと g フラグで「どこを全部変えるか」を指定する。 単純な文字列だけでなく、「数字のかたまり」「特定の記号列」なども対象にできる。 元の文字列は変わらないので、安心して「修正版」を作れる。
「この文字列の中の、あるパターンに合うところを全部直したい」と感じた瞬間に、 まず s.replace(/pattern/g, 'new') という形を思い出せるようになること。
それが、正規表現を「検索だけでなく修正にも使う」感覚を身につけるための、大事な一歩になります。
