正規表現は唯一無二の文字列操作ツールです。特にJavaScriptでの活用範囲は広く、文字列の検証、抽出、変換など多様な用途で威力を発揮します。複雑な要件に直面したとき、正規表現が分かっていれば一気に効率化できるのです。本記事では「JavaScript 正規表現 サンプル」をキーワードに、基本から応用までのサンプルを最新情報を交えながら解説します。見逃せないテクニックや注意点も含め、すぐ使えるコード満載です。
目次
JavaScript 正規表現 サンプル:基本構文と簡単な例
まずは「JavaScript 正規表現 サンプル」のキーワードにぴったりの基本的な構文とシンプルな例を押さえておきます。正規表現の書き方、文字クラス、量指定子、特殊文字、フラグなどの土台が分かっていないと、複雑なパターンでつまずきます。基本的な仕組みを理解することで、その後の応用サンプルもスムーズに理解できます。
正規表現リテラルとコンストラクタ
JavaScriptでは正規表現を定数として使う場合、リテラル表記とRegExpコンストラクタの2通りがあります。リテラルはスラッシュで囲んで表現し、コンストラクタは文字列として渡す形式で動的に生成できます。前者はパース時にコンパイルされるため高速で、後者は変数などからパターンを受け取る柔軟性があります。例えば、リテラルで `/ab+c/`、コンストラクタで `new RegExp(“ab+c”)` のように記述します。
文字クラス・量指定子・特殊文字
文字クラスは `[…]` の中に複数の文字や範囲を指定します。例えば `[a-zA-Z0-9]` は英数字を意味します。量指定子は `*`, `+`, `?`, `{n}`, `{n,}`, `{n,m}` などがあり、繰返し回数を制御します。特殊文字として `d`(数字), `w`(単語文字), `s`(空白文字)などがあり、逆に `D`, `W`, `S` はそれら以外を表します。これら基礎があってこそ正確なマッチングが可能です。
フラグ(修飾子)とアンカー
正規表現にはフラグがあり、`g`(グローバル検索), `i`(大文字小文字を無視), `m`(複数行モード), `u`(ユニコードモード), `y`(スティッキーフラグ)などがあります。アンカーとは文字列の始まりと終わりを示す `^` と `$`、単語境界の `b` や `B` です。これらを使いこなすと「文字列の先頭で始まる数字」「単語単位で区切られた文字列」など精密な条件設定が可能です。
先読み・先読み除外・後読みを使った中級サンプル
基本構文を理解したら、次は「JavaScript 正規表現 サンプル」として先読み・先読み除外・後読み・後読み除外などのアサーションを活用して、より複雑なパターンを抽出できるテクニックを見ていきます。マッチさせる部分を含まず、条件だけを精緻にコントロールできるため、データ処理やバリデーションにおいて非常に強力です。進化した正規表現機能を使って、無駄な後処理を減らせます。
先読み(Positive Lookahead)
先読みはあるパターンが直後に続くことを条件としながらマッチするときに使います。例えば数字が「€」で終わる価格だけを抽出するなら、`d+(?=€)` のように書きます。これにより「€」自体は結果に含まれず、価格部分のみ取得できます。精度の高いマッチングが可能です。スライス処理や前後関係チェックなどに活用されます。
先読み除外(Negative Lookahead)
あるパターンの直後に特定の文字列が来ないことを条件にする場合は先読み除外を使います。例えば「.log」で終わるファイル名以外をマッチさせたいなら `w+(?!.log).w+` のような表現が使えます。これにより「file.txt」はマッチするが「server.log」は除外されます。バリデーションやフィルタリングでの応用が豊富です。
後読み(Positive Lookbehind)と後読み除外(Negative Lookbehind)
後読みは指定した文字列が直前にある場合にマッチさせる表現で、直前の条件を確認するのに非常に有効です。例えばドル記号の後の金額を抽出するなら `(?<=$)d+` のようにします。一方、後読み除外は直前にその文字列がないことを保証します。最新環境では可変長後読み(variable-length lookbehind)もサポートされてきており、複雑なパターンでも書きやすくなっています。ただし古いブラウザでは制限があるので互換性を確認することが大切です。
応用サンプル:文字列抽出・置換・バリデーションで使える実践例
ここでは具体的な「JavaScript 正規表現 サンプル」として、実践でよく出てくる抽出・置換・バリデーションの例を最新環境を想定して紹介します。コード付きで、何を目的としておりどのように正規表現で実現するか、ステップごとに解説します。これらを応用すれば自分の要件に合わせてパターンを応用できるようになります。
メールアドレスのバリデーション
メールアドレスの形式を正確に検証することは、ユーザー入力のチェックなどで頻繁に求められます。例えば「username@domain.tld」の形式を確認するなら、`^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}$` のようなパターンが一般的です。ドットの前後やドメイン部分のハイフン扱いなど細かい仕様を加えることで誤検出を減らせます。
日付形式の抽出(YYYY-MM-DD形式など)
データから日付を抜き出す用途には、`^d{4}-d{2}-d{2}$` のような固定長表現や、文字列中に埋め込まれた日付を取得するために `bd{4}-d{1,2}-d{1,2}b` のようなパターンが使われます。最新仕様では年を 1000~9999、月と日を 01~12、01~31 の範囲チェックを含めたパターンも可能です。後処理で範囲外を除く手法を組み合わせるとさらに正確になります。
HTMLタグ除去やテキスト整形
HTML形式の文字列からタグだけを外してテキストを抽出する場合、正規表現で `]+>` を使ってタグ部分を捕捉し、空文字に置換します。注意点として、属性値中の “>” や “<" の扱い、スクリプトタグなど複雑な内容がある場合の例外処理です。これらは単純な正規表現だけでは対応できないこともありますが、基本的な整形には有効です。
正規表現のパフォーマンスと互換性の注意点
複雑な正規表現を使う場合、「JavaScript 正規表現 サンプル」として正しく動作するだけでなく、高速かつ安全であることも重要です。パフォーマンスに影響する要因を理解し、また実行環境(ブラウザやNode.js等)での互換性を確認することが欠かせません。最新の正規表現機能は強力な反面、古い環境ではサポートされないことがありますので注意が必要です。
貪欲マッチング vs 怠惰マッチング
量指定子には貪欲(greedy)な表現と怠惰(lazy)な表現があります。デフォルトでは貪欲で、できるだけ長くマッチさせようとします。これが意図しない過剰なマッチングを引き起こすことがあります。例えば “ は文字列全体をマッチさせてしまうことがあります。これを防ぐために `.*?` のような怠惰な量指定子を使うか、限定的なクラスや範囲を使って制御します。
バックトラックの爆発と正規表現の効率
非常に複雑な正規表現、特に選択肢や量指定子が多層に入り組んでいるものは、バックトラッキングが大量に発生して処理が極端に遅くなることがあります。これを「Catastrophic backtracking」と呼びます。対策としては選択肢をできるだけ減らす、ネストを浅くする、特定の文字クラスやアンカーをうまく使うなどです。また、先読みや後読みを適切に使うとより効率的な表現が書けます。
互換性:後読み・可変長後読み・Unicodeプロパティ等
最近のJavaScript(ECMAScript仕様)では、可変長の後読みや Unicode のプロパティエスケープ(`p{…}`)など先進的な機能がサポートされてきています。これにより例えば国際文字を含む方法で文字クラスを記述できるようになっています。ただし古いブラウザや特定の Node.js バージョンではこれらが未対応の場合があります。使用前には環境の対応状況を確認することが大切です。
実践演習:ケーススタディで学ぶ正規表現活用
ここからは「JavaScript 正規表現 サンプル」を題材にした演習形式で、課題を提示しそれに対する正規表現での解決策を示します。これにより、読者自身でパターンを考える力を養うとともに、応用できるサンプルを自分のプロジェクトに取り入れられるようになります。演習を通じて理解が深まります。
課題:電話番号・郵便番号の形式チェック
電話番号や郵便番号入力フォームで、「ハイフンあり」または「ハイフンなし」の形式を許可するが、数字以外は許可しないという要件があります。日本で一般的な郵便番号(七桁)や市外局番を含む電話番号について、正規表現でこれを実装します。例えば電話番号なら `^(?:0d{1,4}-?d{1,4}-?d{4})$`、郵便番号は `^d{3}-?d{4}$` のようなパターンが使われます。用途に応じて桁数などの調整も可能です。
課題:ログファイル中のタイムスタンプ抽出
サーバーログやアプリログに含まれる「YYYY-MM-DD hh:mm:ss」の形式のタイムスタンプを抽出する必要があります。複数行テキストから対象を全て取得するパターンとして、`/d{4}-d{2}-d{2} d{2}:d{2}:d{2}/g` を使います。より厳しい条件として月は01~12、日は01~31の範囲をチェックする場合、先読みや後読みで細かく制約を加えることができます。
課題:パスワード強度チェック
パスワード入力で「最低 8 文字」「大文字と小文字を両方含む」「数字を含む」「特殊文字を一つ以上含む」などの条件が求められることがあります。このような複数の条件を一つの正規表現でまとめるのに、先読みアサーションが非常に有用です。例として `^(?=.*[A-Z])(?=.*[a-z])(?=.*d)(?=.*[!@#$%^&*()_+])[A-Za-zd!@#$%^&*()_+]{8,}$` のような表現が考えられます。
先進機能と最新サンプル:Unicode・名前付きキャプチャ・スティッキー フラグ
JavaScript の正規表現は進化を続けており、「JavaScript 正規表現 サンプル」でも注目すべき最新機能があります。これらを活用することで、より読みやすく保守しやすいコードが書けます。Unicode 対応や名前付きキャプチャ、スティッキーフラグなど、最新仕様が活きるサンプルを紹介します。
Unicode プロパティエスケープを使った文字クラス
ユニコード文字を正確に扱うにはプロパティエスケープが便利です。例えば漢字ひらがなカタカナを含むかどうかをチェックするには、`p{Script=Hiragana}`, `p{Script=Katakana}`, `p{Script=Han}` を使えます。正規表現に `u` フラグを付けて `p{…}` が使えるようにします。これにより国際化対応のアプリケーションで誤マッチを減らせます。
名前付きキャプチャグループ
名前付きキャプチャグループを使うと、マッチしたグループにわかりやすい名前をつけられます。例えば `/(?d{4})-(?d{2})-(?d{2})/` のように書くと、マッチ後にオブジェクト形式で年・月・日を参照できるため、後処理が明確になります。読みやすく保守性が高いコードを目指すなら、この機能の使用がおすすめです。
スティッキーフラグ(y)と位置指定検索
スティッキーフラグ `y` は検索位置を固定してマッチングを行うもので、例えば文字列の特定位置から順次処理するような用途に向いています。グローバルフラグと似ていますが、検索が失敗した時点でその位置だけ停止します。これにより不完全なマッチを避け、効率よく逐次処理できます。
まとめ
「JavaScript 正規表現 サンプル」を十分に理解するためには、基本構文、先読み・後読みのアサーション、応用例、最新機能など広範囲を学ぶことが不可欠です。基本が分かればメールチェックや日付抽出などの典型例はすぐ書けるようになりますし、応用演習や最新仕様に慣れておけばより複雑な要件にも対応できます。
また、正規表現は強力である分、パフォーマンスや互換性に注意しなければならない場面もあります。環境によってサポートされていない機能があるため、使用前に仕様を確認することをおすすめします。今日紹介したサンプルを参考に、必要な場面で正規表現を使いこなせるようになってください。
コメント