JavaScriptの正規表現は、テキストデータの検索・置換・抽出を強力にサポートする機能です。例えばフォーム入力のバリデーション・ログデータの解析・スクレイピング・ログファイルのフィルタリングなど、さまざまな場面で使われます。
しかし、記号が多く難解に見えがちで、慣れていないと「どこが間違っているのか分からない」「意図しない結果になる」といった壁にぶつかることが多いのも事実です。
本記事では、JavaScriptの正規表現を基礎から応用まで徹底的に解説し、特に実務で使えるパターンについて詳しく紹介します。
目次
1.正規表現の基本構文と使い方
JavaScriptの正規表現は、テキストの検索や置換、フォーマットの検証など多くの場面で活用される強力な機能です。しかし、記号が多く直感的に理解しにくいため、正しく使いこなすには基礎からの学習が欠かせません。
本章では、JavaScriptにおける正規表現の基本構文と使い方について詳しく解説します。
正規表現の基本構造
JavaScriptで正規表現を扱う方法は2つあります。
リテラル表記
一番シンプルな書き方です。リテラル表記のメリットは、可読性が高く高速であることです。一方でデメリットは動的に生成しづらいことです。
const regex = /pattern/; |
RegExpオブジェクトを使用した方法
動的にパターンを生成する場合に便利です。RegExpオブジェクトを使用した方法のメリットは、変数を使えることで、デメリットは可読性が低くなることです。
const regex = new RegExp("pattern"); |
例えば、変数を使って正規表現を組み立てる場合は、RegExpを使用します。
const searchWord = "apple"; const regex = new RegExp(searchWord, "gi"); console.log("I love Apple and apple pie.".match(regex)); // ["Apple", "apple"] |
主要なメタ文字と特殊記号
JavaScriptの正規表現では、メタ文字やエスケープシーケンスを活用することで、より高度な検索が可能になります。
メタ文字 | 意味 | 例 |
---|---|---|
. | 任意の1文字 | /c.t/ → "cat", "cut" |
^ | 行頭に一致 | /^hello/ → "hello world" 〇, "world hello" ✕ |
$ | 行末に一致 | /world$/ → "hello world" 〇, "world hello" ✕ |
* | 0回以上の繰り返し | /a*/ → "a", "aa", "aaa", "" |
+ | 1回以上の繰り返し | /a+/ → "a", "aa", "aaa" |
? | 0回 or 1回 | /colou?r/ → "color", "colour" |
{n,m} | n回以上m回以下 | /\d{2,4}/ → "12", "123", "1234" |
\d | 数字 ([0-9] と同じ) | /\d+/ → "123" |
\w | 英数字 ([a-zA-Z0-9_]) | /\w+/ → "word123" |
\s | 空白文字 | /\s+/ → " " |
\b | 単語の境界 | /\bword\b/ → "word", "word123" ✕ |
任意の文字列と数字を表すパターン
JavaScriptの正規表現では、任意の文字列や数字を柔軟に検索・抽出するためのパターンを活用することが重要です。特定の文字の組み合わせや、数字のみを対象としたマッチングを行うことで、入力データの検証やテキスト処理を効率化できます。
任意の文字列を表すパターン
任意の1文字を表す .(ドット)は、どんな文字でも1文字にマッチします。
const regex = /c.t/; console.log("cat".match(regex)); // ["cat"] console.log("cut".match(regex)); // ["cut"] console.log("ct".match(regex)); // null (マッチしない) |
数字を表すパターン
\dは数字(0~9) にマッチします。
const regex = /\d+/; console.log("Item123".match(regex)); // ["123"] console.log("No numbers here!".match(regex)); // null |
また、特定の桁数の数字だけを検索したい場合は、{n,m}を活用できます。
const regex = /\d{4}/; console.log("Year: 2025".match(regex)); // ["2025"] console.log("Number: 123".match(regex)); // null (3桁なのでマッチしない) |
2.JavaScriptでの正規表現の利用方法
JavaScriptで正規表現を活用するには、単にパターンを作成するだけでなく、適切なメソッドを使い分けることが重要です。例えば特定のパターンに一致するかどうかを確認する・該当するすべてのマッチを取得する・特定の文字列を置換するなど目的に応じた適切なメソッドを選ぶことで、効率的なテキスト処理が可能になります。
本章では、JavaScriptの組み込みメソッドと正規表現の連携方法について詳しく解説します。
test()を使ったマッチング
test()は、文字列が正規表現に一致するかを判定します。
const regex = /\d+/; console.log(regex.test("abc123")); // true |
match()を使った検索
match()は、正規表現に一致する部分を取得します。
const regex = /\d+/g; console.log("123 abc 456".match(regex)); // ["123", "456"] |
replace()を使った置換
replace()を使えば、特定のパターンを別の文字列に置換できます。
const text = "Hello 123!"; console.log(text.replace(/\d+/, "###")); // "Hello ###!" |
正規表現オプションの活用(g・i・mなど)
JavaScriptの正規表現には、フラグ(オプション) を指定することで、検索の挙動を柔軟に変更することができます。フラグを適切に活用することで、より高度な検索や置換が可能になります。ここでは、代表的なフラグである g(グローバル検索)・i(大文字・小文字を区別しない)・m(複数行モード)について詳しく解説します。
g(グローバル検索)
通常、match()やreplace()などのメソッドを使うと、最初に一致したものだけが対象になります。しかしgフラグを追加すると、文字列全体を検索し、一致するすべての部分を取得できます。
const text = "apple banana apple"; const regex = /apple/; console.log(text.match(regex)); // ["apple"](最初の1つのみ)
console.log(text.match(regexGlobal)); // ["apple", "apple"](すべて取得) |
i(大文字・小文字を区別しない)
デフォルトでは、正規表現は大文字・小文字を区別します。しかし、iフラグを追加すると、大文字・小文字を無視して検索できます。
const text = "JavaScript is amazing. javascript is powerful."; const regex = /javascript/; console.log(text.match(regex)); // ["javascript"](1つ目はマッチしない)
console.log(text.match(regexIgnoreCase)); // ["JavaScript"](大文字・小文字を区別しない)
console.log(text.match(regexGlobalIgnoreCase)); // ["JavaScript", "javascript"](両方取得) |
m(複数行モード)
通常、^(行頭)と$(行末)は、文字列全体の先頭と末尾にマッチします。しかし、mフラグを追加すると、各行の先頭と末尾にマッチするようになります。
const text = `Hello world JavaScript is great Regex is powerful`;
console.log(text.match(regexWithoutM)); // null(最初の行の先頭にないためマッチしない)
console.log(text.match(regexWithM)); // ["JavaScript"](複数行モードで2行目の先頭にマッチ) |
3.正規表現の応用テクニック
ここでは、JavaScriptの正規表現をより実践的に活用するためのテクニックを詳しく解説します。基本の使い方をマスターしたら、「キャプチャグループ」「ネストした正規表現」「動的な正規表現」などを駆使して、より高度なパターンマッチングを実装できます。
キャプチャグループと参照
キャプチャグループ()を使うと、正規表現の一部をグループ化し、マッチした部分を取得できます。また、マッチした部分は$1,$2,$3などのバックリファレンスとして利用できます。
キャプチャグループの基本
const regex = /(\d{4})-(\d{2})-(\d{2})/; const result = "2025-02-11".match(regex); console.log(result[1]); // "2025" console.log(result[2]); // "02" console.log(result[3]); // "11" |
この例では、(\d{4})が年、(\d{2})が月、(\d{2})が日をキャプチャしています。
キャプチャグループを使った置換
バックリファレンスを利用すると、置換の際に元の値を保持したままフォーマットを変更できます。
const date = "2025-02-11"; const reformattedDate = date.replace(/(\d{4})-(\d{2})-(\d{2})/, "$3/$2/$1"); console.log(reformattedDate); // "11/02/2025" |
非キャプチャグループ
キャプチャグループは便利ですが、バックリファレンスが不要な場合は、非キャプチャグループ(?:...)を使うことでパフォーマンスを向上できます。
const regex = /(?:https?|ftp):\/\/[^\s]+/; console.log("Visit https://example.com".match(regex)); // ["https://example.com"] |
ここで、(?:https?|ftp)の?:により、httpsやftpをキャプチャしません。
ネストした正規表現
複雑なデータの解析では、複数の条件を組み合わせたネストした正規表現が必要になります。
HTMLタグの抽出
const regex = /<(\w+)[^>]*>(.*?)<\/\1>/g; const html = "<div>Hello</div><span>World</span>"; console.log(html.match(regex)); // ["<div>Hello</div>", "<span>World</span>"] |
この正規表現では、タグ名をキャプチャし、それと一致する閉じタグがあるかを確認しています。
JSONデータから特定の値を抽出
const json = '{"name": "John", "age": 30, "city": "New York"}'; const regex = /"name":\s*"([^"]+)"/; console.log(json.match(regex)[1]); // "John" |
この正規表現は、"name"に対応する値("John")を取得します。
動的な正規表現
RegExpコンストラクタを使えば、変数を組み込んだ正規表現を動的に生成できます。
const keyword = "apple"; const regex = new RegExp(`\\b${keyword}\\b`, "gi"); console.log("I love Apple and apple pie.".match(regex)); // ["Apple", "apple"] |
\\bを使うことで、完全一致する単語のみを取得しています。
4.実践!よく使う正規表現パターン集
正規表現は、単純な文字列検索からデータの検証・フォーマット変換・抽出まで、幅広い場面で利用されます。
ここでは、実務で頻繁に使うパターンを具体的なコード例とともに詳しく解説します。
メールアドレスのバリデーション
メールアドレスの形式をチェックする際に使われる正規表現です。
const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; console.log(emailRegex.test("test@example.com")); // true console.log(emailRegex.test("invalid-email")); // false |
URLの抽出とバリデーション
WebページやテキストからURLを抽出したい場合、以下の正規表現を使用できます。
const urlRegex = /https?:\/\/[^\s]+/g; const text = "Visit https://example.com and http://test.org for details."; console.log(text.match(urlRegex)); // ["https://example.com", "http://test.org"] |
この正規表現はhttpまたはhttpsで始まり、その後の文字列([^\s]+)をURLとして取得します。
電話番号のフォーマットチェック
電話番号のフォーマットをチェックしたい場合、以下の正規表現を使用できます。
const phoneRegex = /^\d{2,4}-\d{2,4}-\d{4}$/; console.log(phoneRegex.test("03-1234-5678")); // true console.log(phoneRegex.test("090-123-456")); // false |
市外局番\d{2,4}
中間\d{2,4}
下4桁\d{4}
それぞれ-で区切る
関連記事
JavaScriptライブラリとは?おすすめの使い方や導入方法などわかりやすく解説
5.まとめ
本記事では、JavaScriptの正規表現(RegExp)について、基礎から応用、実践的な使い方まで詳しく解説しました。正規表現は、テキストの検索・置換・データの抽出など、さまざまな場面で活用できる強力なツールですが、記号が多く直感的に理解しづらいため、適切な学習と実践が欠かせません。
正規表現をマスターすれば、コードの効率化やデータ処理の自動化につながります。本記事で学んだ内容を活用し、より実践的なスキルを磨いていきましょう。
本記事が皆様にとって少しでもお役に立てますと幸いです。