ブログに戻る
RegEx12 min read
初心者向け正規表現チュートリアル
実用的な例、一般的なパターン、デバッグ技法を使ってゼロから正規表現を学習。
正規表現の紹介
正規表現(regexまたはregexp)は、テキストのマッチング、検索、 操作に使用される強力なパターンです。テキスト処理に特化した ミニプログラミング言語のようなものです。
Regexを使用するタイミング
- 入力の検証(メール、電話番号、URL)
- テキストパターンの検索と置換
- 構造化データの解析
- 文字列からの情報抽出
- データのクリーニングとフォーマット
基本パターンマッチング
リテラル文字
最もシンプルな正規表現パターンは正確な文字とマッチします:
パターン | マッチ | 例 |
---|---|---|
cat | 単語"cat" | "The cat sat" |
123 | 数字"123" | "Room 123" |
メタ文字と特殊シーケンス
メタ文字は正規表現で特別な意味を持ちます:
文字 | 意味 | 例 |
---|---|---|
. | 任意の単一文字 | c.tは"cat", "cut", "c9t"とマッチ |
^ | 文字列の開始 | ^Helloは"Hello world"とマッチ |
$ | 文字列の終端 | world$は"Hello world"とマッチ |
\d | 任意の数字 (0-9) | \d\dは"42", "99"とマッチ |
\w | 単語文字 (a-z, A-Z, 0-9, _) | \w+は"hello", "test_123"とマッチ |
\s | 空白文字 | a\sbは"a b", "a b"とマッチ |
文字クラス
文字クラスを使用すると、複数の文字のうち任意の一つとマッチさせることができます:
[abc] # 'a'、'b'、または'c'とマッチ [a-z] # 任意の小文字とマッチ [0-9] # 任意の数字とマッチ [^abc] # 'a'、'b'、'c'以外の任意の文字とマッチ
量詞
量詞はパターンが何回マッチすべきかを指定します:
基本量詞
- * = 0回以上
- + = 1回以上
- ? = 0回または1回
- {n} = 正確にn回
- {n,} = n回以上
- {n,m} = n回からm回の間
例
a*
は"", "a", "aaa"とマッチa+
は"a", "aaa"とマッチ (""ではない)a?
は"", "a"とマッチa{3}
は"aaa"とマッチa{2,4}
は"aa", "aaa", "aaaa"とマッチ
グループとキャプチャ
括弧はキャプチャされ、再利用できるグループを作成します:
// キャプチャグループ const pattern = /(\d{3})-(\d{3})-(\d{4})/; const phone = "123-456-7890"; const match = phone.match(pattern); // match[0] = "123-456-7890" (全体マッチ) // match[1] = "123" (第1グループ) // match[2] = "456" (第2グループ) // match[3] = "7890" (第3グループ)
一般的な正規表現パターン
メールアドレス
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
電話番号 (米国)
^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$
パスワード (8文字以上、大小文字混在、数字)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{8,}$
JavaScriptでの正規表現の使用
正規表現パターンの作成
// リテラル記法 const pattern1 = /hello/i; // iフラグ = 大文字小文字を区別しない // コンストラクタ記法 const pattern2 = new RegExp('hello', 'i'); // 動的パターン const searchTerm = 'world'; const pattern3 = new RegExp(searchTerm, 'gi');
一般的なメソッド
// test() - ブール値を返す const pattern = /\d+/; console.log(pattern.test("abc123")); // true // match() - マッチ配列またはnullを返す const text = "Contact: 123-456-7890"; const matches = text.match(/\d{3}-\d{3}-\d{4}/); console.log(matches[0]); // "123-456-7890"
正規表現のデバッグとテスト
一般的な正規表現の落とし穴
- 貲欲と非貲欲: 最小マッチには
.*
の代わりに.*?
を使用 - エスケープ: 特殊文字をエスケープすることを忘れない
- 複数行: 複数行にわたるパターンには
m
フラグを使用 - パフォーマンス: ネストした量詞での破綻的バックトラッキングを避ける
より良い正規表現を書くためのコツ
シンプルから始める
パターンを漸進的に構築します。シンプルなマッチから始めて複雑さを追加します。
徹底的にテスト
エッジケース、空文字列、予期しない入力でテストします。
代替手段を検討
時にはシンプルな文字列メソッドの方が複雑な正規表現よりも明確です。
結論
正規表現は非常に強力ですが、複雑になることがあります。シンプルなパターンから始めて、 徹底的にスキルを構築していきましょう。可読性が重要であることを忘れないでください– 少し長くても明確なパターンの方が、粗敏なワンライナーよりも良いことがよくあります。