JavaScript RegExpオブジェクト: 文字列操作を極めるための完全ガイド
JavaScriptで複雑な文字列処理をマスターしたいなら、RegExpオブジェクトの理解は必須です。本記事では、RegExpオブジェクトの基礎から、その驚くべきパワーを引き出す応用テクニック、そしてよくある疑問への回答まで、詳細に解説していきます。
RegExpオブジェクト: 基礎から理解する
正規表現とは: 文字列のパターンを表現する
人間が言語で表現する複雑なルールを、コンピュータに理解させるための手段、それが正規表現です。特定のパターンに合致する文字列を見つけ出したり、置換したり、抽出したりすることができます。
RegExpオブジェクト: 正規表現を扱うための存在
JavaScriptでは、RegExpオブジェクトを使って正規表現を表現し、操作します。
RegExpオブジェクトの作成: 2つの方法
-
リテラル表記: スラッシュ(/)で囲むだけの、シンプルで直感的な方法。
const regex = /pattern/;
-
コンストラクタ関数: new RegExp("pattern") で、柔軟性と動的な生成を可能にします。
const regex = new RegExp("pattern");
記述方法 | 特徴 |
リテラル表記 | シンプル、可読性が高い、コンパイル時にパターンが決定されるため高速 |
コンストラクタ関数 | 変数を利用して動的なパターン生成が可能、実行時にパターンを決定 |
RegExpオブジェクトのプロパティ: 正規表現の内部情報にアクセス
RegExpオブジェクトは、その内部状態に関する情報を提供するプロパティを持っています。
プロパティ | 説明 |
global | マッチを複数回行うか (g フラグ) |
ignoreCase | 大文字小文字を区別するか (i フラグ) |
multiline | 複数行に渡ってマッチを行うか (m フラグ) |
lastIndex | 次回のマッチ開始位置 |
source | 正規表現のパターン文字列 |
RegExpオブジェクトのメソッド: 文字列操作の達人技
test(): マッチ判定
test() メソッドは、指定した文字列が正規表現にマッチするかどうかを判定し、trueまたはfalseを返します。
const regex = /hello/;
const result = regex.test("hello world");
console.log(result); // true
exec(): マッチ情報取得
exec() メソッドは、マッチした部分の詳細な情報を配列で返します。
const regex = /hello/;
const result = regex.exec("hello world");
console.log(result);
// ["hello", index: 0, input: "hello world", groups: undefined]
Stringオブジェクトの正規表現メソッド: 文字列操作の強力な助っ人
Stringオブジェクトにも、正規表現を利用したメソッドが用意されています。
メソッド | 説明 |
match(regexp) | マッチする部分文字列を配列で返す |
search(regexp) | 最初にマッチした箇所のインデックスを返す |
replace(regexp, replacement) | マッチする部分を置換 |
split(regexp) | マッチする部分を区切り文字として分割 |
正規表現の文法: パターンの組み立て方
文字クラス: 文字の種類を指定する
特定の種類の文字とマッチさせるための記号です。
記述 | 説明 |
. | 任意の1文字 |
\d | 数字 |
\w | 英数字とアンダースコア |
\s | 空白文字 |
[abc] | a, b, c のいずれか |
[^abc] | a, b, c 以外 |
量指定子: 繰り返し回数を制御する
直前の文字やグループの繰り返し回数を指定します。
記述 | 説明 |
* | 0回以上の繰り返し |
+ | 1回以上の繰り返し |
? | 0回または1回の出現 |
{n} | ちょうど n 回の繰り返し |
{n,} | n 回以上の繰り返し |
{n,m} | n 回以上、m 回以下の繰り返し |
グループ化とキャプチャ: 部分的なパターンをまとめる
括弧 () を使って、複数の文字をグループ化し、後から参照することができます。
const regex = /(\d{4})-(\d{2})-(\d{2})/;
const result = regex.exec("2023-10-26");
console.log(result[1]); // 2023 (年)
console.log(result[2]); // 10 (月)
console.log(result[3]); // 26 (日)
その他の文法要素: より複雑なパターンを表現
-
先頭と末尾のアンカー: ^ (先頭), $ (末尾)
-
選択: \| (または)
-
後読みアサーション: (?=pattern) (肯定), (?!pattern) (否定)
RegExpオブジェクトを使いこなすためのヒント
動的な正規表現の作成: 状況に合わせてパターンを変更
コンストラクタ関数を使うことで、変数を含んだ動的な正規表現を生成できます。
const word = "apple";
const regex = new RegExp(`${word}$`);
// "apple$" というパターンを持つ正規表現を生成
貪欲マッチと非貪欲マッチ: マッチする範囲を制御
量指定子 (*, +, ?, {n,}) は、デフォルトでは可能な限り長い範囲にマッチしようとします (貪欲マッチ)。
最短の範囲にマッチさせたい場合は、量指定子の後に ? をつけて 非貪欲マッチ に変更します。
const text = "<h1>Title</h1>";
const greedyRegex = /<.+>/;
const nonGreedyRegex = /<.+?>/;
console.log(text.match(greedyRegex)[0]); // "<h1>Title</h1>"
console.log(text.match(nonGreedyRegex)[0]); // "<h1>"
よくある正規表現の例: 実践で役立つパターン集
説明 | 正規表現 |
メールアドレスの検証 | ^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$ |
電話番号の検証 (日本の場合) | ^0\d{1,4}-\d{1,4}-\d{4}$ |
URL の検証 | ^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$ |
まとめ: RegExpオブジェクトで文字列処理を極める
RegExpオブジェクトは、複雑な文字列処理をシンプルに記述することを可能にする、JavaScript開発者にとって非常に強力なツールです。その豊富な機能と柔軟性を理解し、使いこなせるようになれば、より効率的で、可読性の高いコードを書くことができます。
関連QA
Q1: 正規表現の中でエスケープが必要な文字は?
A1: \, /, ., *, +, ?, {, }, (, ), [, ], ^, $, \| など、メタ文字として特別な意味を持つ文字は、エスケープする必要があります。 例えば、. (任意の1文字) を表現したい場合は、\.と記述します。
Q2: 正規表現のリテラル表記とコンストラクタ関数の使い分けは?
A2: パターンが固定であれば、シンプルで高速なリテラル表記で十分です。一方、変数を含めて動的にパターンを生成する必要がある場合は、コンストラクタ関数を利用します。
Q3: 正規表現のデバッグ方法にはどのようなものがありますか?
A3: オンラインの正規表現テストツールを利用するのが便利です。また、console.log()でマッチング結果を確認したり、開発者ツールのデバッガでステップ実行しながら動作を確認するのも有効です。