【JS応用|実務向け】JavaScript正規表現:RegExpと文字列メソッドの使い分け完全ガイド

1. 導入:なぜ正規表現のメソッドを使い分ける必要があるのか

JavaScriptで文字列操作を行う際、`String`型のメソッドと`RegExp`型のメソッドの両方が存在し、どちらを使うべきか迷うことはありませんか?これらを正しく使い分けることで、コードの可読性が向上するだけでなく、パフォーマンスの最適化や、マッチした位置・キャプチャグループの正確な取得が可能になります。本記事では、実務で頻出するパターンを整理し、現場で役立つ実装Tipsを紹介します。

2. 基礎知識:正規表現を扱う2つのアプローチ

正規表現には、以下の2つのアプローチがあります。

Stringメソッド: `str.match()`, `str.replace()`, `str.split()`, `str.search()`
主に「文字列に対する操作」として直感的に記述できます。

RegExpメソッド: `reg.test()`, `reg.exec()`
正規表現オブジェクト自体が持つメソッドです。`g`(グローバル)フラグを組み合わせることで、連続的な検索や位置の保持が可能です。

3. 実装・解決策:現場で選ぶべき「最適解」

実務では、目的によって使い分けるのが鉄則です。

マッチの有無だけ知りたい場合
`if (/pattern/.test(str))` を使用してください。`search`で `-1` と比較するよりも意図が明確です。

すべてのマッチを詳細に取得したい場合
`str.match(/pattern/g)` は便利ですが、マッチした位置やキャプチャグループの情報が失われます。詳細が必要な場合は、`while`ループと `reg.exec()` を組み合わせるのが最も堅牢です。

置換にロジックを含めたい場合
`str.replace()` の第二引数に関数を渡すことで、マッチした内容に基づいた動的な置換が可能です。これはHTMLのテンプレート置換や、ログの整形などで非常に強力です。

4. サンプルプログラム:実務で使えるコード例

// 1. マッチの有無を判定
const str = “ID: 12345, Status: Active”;
if (/ID: \d+/.test(str)) {
console.log(“IDが見つかりました”);
}

// 2. キャプチャグループを利用した詳細な抽出
// exec() はループ内で使用することで、位置情報付きのマッチを取得できます
const text = “Item: Apple, Price: 100; Item: Orange, Price: 200;”;
const regex = /Item: (\w+), Price: (\d+)/g;
let match;

while ((match = regex.exec(text)) !== null) {
// match[0]: マッチ全体, match[1]: 1つ目の括弧, match[2]: 2つ目の括弧
console.log(`品名: ${match[1]}, 価格: ${match[2]}, 開始位置: ${match.index}`);
}

// 3. 関数を使った動的な置換
const input = “Price: 1000, Tax: 100”;
const output = input.replace(/\d+/g, (match) => {
// すべての数値を2倍にして置き換える
return parseInt(match) 2;
});
console.log(output); // “Price: 2000, Tax: 200”

5. 応用・注意点:現場で陥りやすいバグ

nullのチェックを忘れない
`str.match()` はマッチするものがない場合に `null` を返します。`str.match(reg).length` のようにいきなりプロパティにアクセスすると、`TypeError` が発生します。必ず `const result = str.match(reg); if (result) { … }` のようにガード句を挟みましょう。

`g`フラグと`exec`の副作用
`g`フラグを付けた正規表現オブジェクトを使い回すと、`lastIndex` プロパティが更新され続け、意図しない場所から検索が始まってしまうことがあります。ループを抜けた後や、別の文字列を検索する際は `reg.lastIndex = 0` にリセットする癖をつけましょう。

パフォーマンスと`y`フラグ
大量のテキストをパースする場合、`y`フラグを活用して「先頭から指定位置」のみを厳密にチェックすることで、検索範囲を限定しパフォーマンスを劇的に向上させることが可能です。

タイトルとURLをコピーしました