正規表現パターン
テキストの検索・置換に使うパターン記述言語。特殊文字とリテラル文字を組み合わせて文字列のパターンを定義する。
正規表現パターン (Regular Expression Pattern) は、テキストの検索・置換・検証に使われるパターン記述言語です。メタ文字 (特殊文字) とリテラル文字を組み合わせて文字列のパターンを定義します。1950 年代に数学者スティーブン・クリーネが形式言語理論で提唱した概念に起源を持ち、現在ではほぼすべてのプログラミング言語とテキストエディタでサポートされています。
JavaScript では /pattern/flags のリテラル記法か new RegExp('pattern', 'flags') のコンストラクタで正規表現を作成します。test() でマッチの有無を判定、match() でマッチ結果を取得、replace() で置換、split() で分割を行います。リテラル記法はパターンが固定の場合に、コンストラクタは動的にパターンを組み立てる場合に使い分けます。
基本的なメタ文字には . (任意の 1 文字)、^ (行頭)、$ (行末)、| (OR) があります。フラグには g (グローバル検索)、i (大文字小文字無視)、m (複数行モード)、s (dotAll モード)、u (Unicode モード) などがあり、マッチの挙動を制御します。ES2022 で追加された d フラグはマッチのインデックス情報を取得できます。
正規表現の実務での活用範囲は広大です。メールアドレスや電話番号の形式検証、ログファイルからの情報抽出、テキストエディタの検索置換、Web スクレイピングでのデータ抽出、入力バリデーションなど、テキストを扱うあらゆる場面で使われます。ただし、HTML や JSON のような構造化データの解析には正規表現は不向きであり、専用のパーサーを使うべきです。
正規表現を書く際の注意点として、可読性の確保があります。複雑なパターンはコメント付きの拡張モード (一部の言語でサポート) や、パターンを変数に分割して組み立てる方法で可読性を高められます。もう一つの落とし穴は破滅的後戻り (catastrophic backtracking) です。/^(a+)+$/ のように繰り返しが入れ子になったパターンへ、マッチしない文字列 (a の連続の末尾に b) を渡すと試行の組み合わせが指数関数的に増えます。Node.js 26 で a を 28 個並べた入力を与えると、1 回の test() に約 17 秒かかりました。これが ReDoS (正規表現サービス拒否攻撃) が成立する仕組みで、対策はパターン設計の見直し (入れ子の繰り返しを避ける・独占的量指定子やアトミックグループが使える言語ではそれを用いる) と、照合の実行時間に上限を設けることです。
ユーザー入力をパターン文字列そのものへ埋め込む場合は、これとは別にメタ文字のエスケープが必要です。検索語に . や ( が含まれると意図しないパターンとして解釈されてしまうため、JavaScript では ES2025 で追加された RegExp.escape() を使うか、同等の置換処理を自前で用意します。エスケープは意図の取り違えを防ぐ処置であり、破滅的後戻りは防げない点に注意してください。対策は別々に必要です。
文字数カウントとの関連では、正規表現はテキスト分析の基盤技術です。特定のパターンに一致する文字列の出現回数を数えたり、空白や記号を除いた実質的な文字数を算出したり、テキストの構成要素 (漢字、ひらがな、カタカナ、英数字) を分類して集計したりする処理に正規表現が活用されます。文字種の判定は文字コードの範囲を手書きするより Unicode プロパティエスケープが確実で、u フラグを付けたうえで \p{Script=Han} (漢字)、\p{Script=Hiragana}、\p{Script=Katakana} と書けます。ただしこれはコードポイント単位の判定なので、絵文字のように複数のコードポイントで 1 文字を構成する対象を数える用途には向きません。