【JavaScript】match()メソッドで文字列パターンを簡単に検索する方法

match() は、文字列の中から正規表現に一致する部分を探して配列で返すメソッドです。一致部分の抽出やパターン検索によく使います。

基本は簡単ですが、/g を付けるとキャプチャグループが消える」という見落としやすい落とし穴があります。この記事では、その点まで含めて正しく解説します。

この記事の結論:str.match(正規表現) で一致部分を配列で取得します。/g なしは「最初の一致+キャプチャグループ+位置」/g ありは「全マッチ(ただしグループは消える)」。全マッチとグループの両方が欲しいなら matchAll。一致しないと null が返るので ?. で対策します。
スポンサーリンク

基本:match()で検索する(null対策)

文字列に対して match(正規表現) を呼ぶと、一致した部分を含む配列が返ります。一致しないと null が返るので、続けて値を読むときは注意が必要です。

JavaScript:基本とnull対策
const str = "The quick brown fox.";

const result = str.match(/quick/);
console.log(result[0]); // "quick"

// 一致しないと null が返る
console.log(str.match(/cat/)); // null

// null対策: ?. で安全に取り出す(無ければ undefined)
const word = str.match(/cat/)?.[0];
console.log(word); // undefined(エラーにならない)

/gフラグで全マッチを取得する

/g(グローバル)フラグを付けると、最初の1つではなく一致するすべてを配列で返します。

JavaScript:/gで全マッチ
const str = "quick brown fox, quick cat";

const all = str.match(/quick/g);
console.log(all); // ["quick", "quick"]

キャプチャグループで部分を取り出す(名前付きも)

正規表現の ( )(キャプチャグループ)で囲んだ部分は、結果の配列の [1] 以降に入ります。match.index で一致開始位置も分かります。

JavaScript:キャプチャグループ
const str = "name is John Doe.";

const m = str.match(/name is (\w+) (\w+)/);
console.log(m[0]);    // "name is John Doe"(全体)
console.log(m[1]);    // "John"(1つ目のグループ)
console.log(m[2]);    // "Doe"
console.log(m.index); // 0(一致開始位置)

グループに名前を付けると、match.groups.名前 で取り出せて読みやすくなります。

JavaScript:名前付きキャプチャグループ
const str = "name is John Doe.";

const m = str.match(/name is (?<first>\w+) (?<last>\w+)/);
console.log(m.groups.first); // "John"
console.log(m.groups.last);  // "Doe"

重要:/g とキャプチャグループは両立しない

ここが最大の落とし穴です。/g を付けると、全マッチは取れますがキャプチャグループは消えてしまいます(全体一致だけが配列に並ぶ)。

JavaScript:/gでグループが消える
const str = "John Doe and Jane Roe";

// /g を付けると全マッチは取れるが、グループ(John等)は取れない
console.log(str.match(/(\w+) (\w+)/g));
// → ["John Doe", "Jane Roe"](John / Doe が取り出せない)
両方欲しいなら matchAll:「全マッチ」と「キャプチャグループ」を同時に取りたいときは、matchAll を使います(/g 必須)。イテレータが返るのでスプレッド [...] で配列にします。
JavaScript:matchAllで全マッチ+グループ
const str = "John Doe and Jane Roe";

const all = [...str.matchAll(/(\w+) (\w+)/g)];
all.forEach((m) => console.log(m[1], m[2]));
// John Doe
// Jane Roe

特定の文字に挟まれた部分を抽出する実用例は特定の文字に挟まれた文字列を取得する方法、数値だけを取り出す例は文字列から数値のみ取得する方法も参考になります。

match / exec / matchAll / test の使い分け

似たメソッドがいくつかあります。目的で選びましょう。

メソッド 呼び出し 主な用途
str.match(re) 文字列側 最初の一致+グループ(/gなし)/全マッチ(/gあり・グループ無し)
str.matchAll(re) 文字列側 全マッチ+グループをまとめて(/g 必須)
re.exec(str) 正規表現側 /g でlastIndexを使い1件ずつ繰り返す
re.test(str) 正規表現側 一致するかどうかの true / false だけ

一致した部分を置換したい場合はreplace()で文字列を置換する方法を参照してください。

よくある質問(FAQ)

QJavaScriptのmatch()メソッドの使い方は?
Astring.match(正規表現) で一致した部分を配列で返します。/g ありで全マッチ、なしで最初のマッチとキャプチャグループを返します。一致がなければ null を返すので ?. で対策しましょう。
Qmatch()で/gを付けたらキャプチャグループが取れなくなりました。
A仕様です。/g を付けると全マッチは取れますがキャプチャグループは消えます。全マッチとグループの両方が必要なら matchAll() を使ってください(/g 必須)。
Qmatch()とexec()の違いは何ですか?
Amatch() は文字列のメソッドで正規表現を引数に取ります。exec() は正規表現のメソッドで文字列を引数に取り、/glastIndex を使って繰り返しマッチできます。繰り返しには exec()matchAll() が適しています。
Q一致するかどうかだけを知りたい場合は?
A正規表現.test(文字列) を使います。true / false を返すだけなので、存在確認には match() より高速で簡潔です。

まとめ

match()str.match(正規表現) で一致部分を配列で取得します。/g なしは最初の一致+キャプチャグループ+位置(index/g ありは全マッチ(ただしグループは消える)です。

最大の注意点は、全マッチとキャプチャグループの両方が欲しいなら matchAll() を使うこと。そして一致しないと null が返るので ?. で対策しましょう。存在確認だけなら test()、置換なら replace() と使い分けるのがコツです。