JavaScriptでの正規表現マッチング
このページでは、JavaScriptにおける正規表現を用いた文字列マッチング方法を詳しく解説します。以下の各セクションにジャンプできます。
regexp.exec()
regexp.exec()
は、正規表現に基づいて文字列を検索し、マッチした最初の結果を配列として返します。繰り返し実行することで、次のマッチを取得できます。
使用例
// 正規表現を定義
const regex = /(\d+)/g;
const str = "123 and 456";
// 1回目の検索
let match = regex.exec(str);
console.log(match); // ["123", "123", index: 0, input: "123 and 456", groups: undefined]
// 2回目の検索
match = regex.exec(str);
console.log(match); // ["456", "456", index: 8, input: "123 and 456", groups: undefined]
// 3回目の検索(結果なし)
match = regex.exec(str);
console.log(match); // null
このように、exec()
は正規表現のg
フラグ(グローバル)を利用することで繰り返しマッチを探せます。
注意点
正規表現がグローバルフラグを持っている場合、exec()
は内部状態を保持します。そのため、ループを使うことも可能です。
const regex = /(\d+)/g;
const str = "123 and 456";
let match;
while ((match = regex.exec(str)) !== null) {
console.log(`Matched: ${match[0]}, Index: ${match.index}`);
}
// Matched: 123, Index: 0
// Matched: 456, Index: 8
str.match()
str.match()
は文字列に対して正規表現を適用し、マッチした結果を返します。正規表現にg
フラグがある場合とない場合で挙動が異なります。
使用例
グローバルフラグがない場合、最初のマッチを配列で返します。
const str = "123 and 456";
const match = str.match(/(\d+)/);
console.log(match); // ["123", "123", index: 0, input: "123 and 456", groups: undefined]
グローバルフラグがある場合、すべてのマッチを配列で返します。
const str = "123 and 456";
const matches = str.match(/(\d+)/g);
console.log(matches); // ["123", "456"]
regexp.test()
regexp.test()
は正規表現を文字列に適用し、一致するものがあればtrue
を、なければfalse
を返します。
使用例
const regex = /\d+/;
console.log(regex.test("123")); // true
console.log(regex.test("abc")); // false
test()
は特に条件分岐で利用されることが多いです。
const regex = /\d+/;
const input = "Value: 42";
if (regex.test(input)) {
console.log("数字が含まれています");
} else {
console.log("数字は含まれていません");
}
regexp.compile()(非推奨)
regexp.compile()
は既存の正規表現を再コンパイルするためのメソッドですが、現在では非推奨です。代わりに新しい正規表現オブジェクトを作成することが推奨されます。
非推奨の例
const regex = /\d+/;
regex.compile("\\w+"); // 非推奨
console.log(regex.test("abc")); // true
推奨される代替方法
const regex = new RegExp("\\w+");
console.log(regex.test("abc")); // true
str.matchAll()
str.matchAll()
は、すべてのマッチ結果をイテレーターとして返します。g
フラグが必要で、各マッチの詳細情報を扱うことができます。
使用例
const str = "123 and 456";
const regex = /(\d+)/g;
const matches = str.matchAll(regex);
for (const match of matches) {
console.log(`Matched: ${match[0]}, Index: ${match.index}`);
}
// Matched: 123, Index: 0
// Matched: 456, Index: 8
matchAll()
はexec()
に似ていますが、イテレーターを使用してすべての結果を一度に取得するため、for...of
ループやArray.from()
で処理しやすいです。