JavaScriptでの正規表現オブジェクト (RegExp)
JavaScriptでは、正規表現を使用して文字列のパターンマッチングや置換などを効率的に行うことができます。このページでは、RegExp
オブジェクトの基本構文、フラグの使い方、応用例を詳しく解説します。
正規表現オブジェクトの作成
JavaScriptでは、正規表現オブジェクトを2つの方法で作成できます。
- リテラル表記:
/pattern/flags
- コンストラクタ表記:
new RegExp(pattern[, flags])
例:
// リテラル表記
const regex1 = /abc/i;
// コンストラクタ表記
const regex2 = new RegExp("abc", "i");
上記の両方の例は、「abc」という文字列を大文字小文字を区別せずに検索する正規表現を作成します。
正規表現フラグの種類
正規表現には、検索の挙動を制御するためのフラグがあります。フラグはリテラル表記ではスラッシュの後に、コンストラクタ表記では第2引数に指定します。
g
: グローバル検索。すべての一致を検索します。i
: 大文字小文字を区別しない検索。m
: 複数行モード。s
: ドット (.
) を改行文字にも一致させます。u
: Unicodeモード。y
: スティッキーモード。検索開始位置が固定されます。
例:
// フラグの例
const regex = /hello/gi;
console.log("Hello, hello!".match(regex)); // ["Hello", "hello"]
基本構文
正規表現のパターンは、文字列内の特定の文字や文字列の組み合わせを記述するものです。以下は主要な構文です。
.
: 任意の1文字\d
: 数字 (0-9)\w
: 単語文字 (英数字およびアンダースコア)\s
: 空白文字[abc]
:a
,b
,c
のいずれか[^abc]
:a
,b
,c
以外の文字a|b
:a
またはb
*
: 直前の文字の0回以上の繰り返し+
: 直前の文字の1回以上の繰り返し?
: 直前の文字が0回または1回{n}
: 直前の文字がちょうどn
回{n,}
: 直前の文字がn
回以上{n,m}
: 直前の文字がn
回以上、m
回以下
例:
// 任意の数字を検索
const regex = /\d+/;
console.log("123abc".match(regex)); // ["123"]
数学的な表現との関連
正規表現は数学的には形式言語理論に基づいています。例えば、正規表現のパターンは、次のような集合を記述します。
文字列 s
が正規表現 r
に一致する場合、次が成り立ちます:
\[ s \in L(r) \]
ここで、L(r)
は正規表現 r
に対応する言語 (文字列集合) です。
例: 正規表現 /a+/
は次のような言語を定義します:
\[ L(/a+/) = \{ “a”, “aa”, “aaa”, \dots \} \]
応用例
正規表現を使うと、さまざまな文字列操作が可能です。
メールアドレスの検証
// メールアドレスの簡易検証
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
console.log(emailRegex.test("example@example.com")); // true
console.log(emailRegex.test("invalid-email")); // false
文字列の置換
// 文字列内の数字を「#」に置き換える
const str = "My phone number is 123-456-7890.";
const result = str.replace(/\d/g, "#");
console.log(result); // "My phone number is ###-###-####."
URLのパース
// URLからドメイン名を抽出
const url = "https://www.example.com/path?query=123";
const domainRegex = /https?:\/\/(www\.)?([^\/]+)/;
const match = url.match(domainRegex);
console.log(match[2]); // "example.com"
まとめ
JavaScriptの正規表現は非常に強力なツールで、文字列の操作やパターンマッチングに役立ちます。リテラル表記とコンストラクタ表記を適切に使い分け、フラグや構文を理解することで、より効果的に利用することができます。