正規表現
💡 学習ガイド:正規表現は暗号のように見えますか?実は、これは「テキストパターンを記述する」ためのミニ言語に過ぎません。この章では、ゼロから正規表現の核心的な考え方を理解し、いくつかの重要な記号でテキスト検索と検証の問題の 80% を解決できるようになります。
0. なぜ正規表現が必要なのか?
以下のようなシナリオを想像してください:
- 大量のログからすべての IP アドレスを見つける
- ユーザーが入力したメールアドレスの形式が正しいか検証する
- テキスト中のすべての日付形式を
2024/01/15から2024-01-15に置換する - ウェブページのソースコードからすべてのリンクを抽出する
通常の文字列検索では? 大量の if-else 条件分岐を書く必要があります。 正規表現では? 1 行のパターンで完了します。
1. 正規表現入門:3 分で始めよう
👇 試してみよう:正規表現を入力して、リアルタイムでマッチ結果を確認
Regular Expressions: Search Engine for TextPattern matching · capture groups · live preview
//
Match results3 match(es)
My phone is 13812345678, landline is 010-12345678, and email is test@example.com
#1
"13812345678"#2
"010"#3
"12345678"Try presets:
Core idea:A regular expression is a small language for describing text patterns with special symbols. It appears everywhere in search, replacement, and validation.
💡 一言で理解する
正規表現 = 特殊な記号を使って「どんなテキストを探したいか」を記述する。\d は数字、+ は 1 回以上を意味するので、\d+ は「1 桁以上の数字」となります。
2. コア概念:ブロックを組み合わせるように構築
正規表現の本質は、3 種類のブロックを組み合わせて目的のパターンを作ることです:
2.1 ブロック 1:文字クラス(どんな文字にマッチするか)
| 構文 | 意味 | 例 |
|---|---|---|
. | 任意の文字 | a.c → abc, a1c, a c |
\d | 数字 [0-9] | \d\d → 42, 99 |
\w | 英数字/アンダースコア | \w+ → hello, user_1 |
\s | 空白文字 | スペース、タブにマッチ |
[abc] | セット内の任意の 1 文字 | [aeiou] → 母音 |
[^abc] | セットに含まれない文字 | [^0-9] → 数字以外の文字 |
2.2 ブロック 2:量指定子(何回マッチするか)
| 構文 | 意味 | 例 |
|---|---|---|
* | 0 回以上 | ab* → a, ab, abbb |
+ | 1 回以上 | ab+ → ab, abbb(a にはマッチしない) |
? | 0 回または 1 回 | colou?r → color, colour |
{3} | ちょうど 3 回 | \d{3} → 123 |
{2,4} | 2 回から 4 回 | \d{2,4} → 12, 1234 |
2.3 ブロック 3:位置とグループ化
| 構文 | 意味 | 例 |
|---|---|---|
^ | 行の先頭 | ^Hello → Hello で始まる行 |
$ | 行の末尾 | end$ → end で終わる行 |
\b | 単語の境界 | \bcat\b → cat(catch にはマッチしない) |
(...) | キャプチャグループ | (\d+)-(\d+) → それぞれキャプチャ |
a|b | または | cat|dog → cat または dog |
3. 実践:よくある検証パターン
3.1 メールアドレスの検証
[\w.+-]+@[\w-]+\.[\w.]+分解:
[\w.+-]+— ユーザー名部分(英数字、ドット、プラス、ハイフン)@— リテラル @[\w-]+— ドメイン部分\.— エスケープされたドット[\w.]+— トップレベルドメイン
3.2 電話番号の検証(中国)
1[3-9]\d{9}分解:
1— 1 で始まる[3-9]— 2 桁目は 3-9\d{9}— 続く 9 桁の数字
3.3 パスワード強度チェック
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$分解:
(?=.*[a-z])— 小文字を少なくとも 1 つ含む(先読みアサーション)(?=.*[A-Z])— 大文字を少なくとも 1 つ含む(?=.*\d)— 数字を少なくとも 1 つ含む.{8,}— 全体で 8 文字以上
4. コードで正規表現を使う
JavaScript
javascript
const text = '連絡先:13812345678 または 15099887766'
const regex = /1[3-9]\d{9}/g
const phones = text.match(regex)
// ['13812345678', '15099887766']
// 置換
text.replace(/\d{4}(?=\d{4}$)/, '****')
// 電話番号の中央 4 桁を隠す
// 検証
/^[\w.+-]+@[\w-]+\.[\w.]+$/.test('user@example.com')
// truePython
python
import re
text = '価格は 99 元、割引 20 元'
numbers = re.findall(r'\d+', text)
# ['99', '20']
# 置換
re.sub(r'\d+', 'X', text)
# '価格は X 元、割引 X 元'
# グループキャプチャ
match = re.search(r'(\d+)-(\d+)', '2024-01-15')
match.group(1) # '2024'
match.group(2) # '01'5. 貪欲 vs 怠惰:重要な違い
テキスト: <b>hello</b> and <b>world</b>| パターン | マッチ結果 | 説明 |
|---|---|---|
<b>.*</b> | <b>hello</b> and <b>world</b> | 貪欲:できるだけ多くマッチ |
<b>.*?</b> | <b>hello</b> | 怠惰:できるだけ少なくマッチ |
💡 覚えておこう
デフォルトは貪欲モードです。量指定子の後に ? を付けると怠惰モードになります。ほとんどの場合、怠惰モードが必要です。
6. まとめ
📚 重要ポイント
- 正規表現 = テキストパターンを記述するミニ言語。検索、マッチ、置換に使用
- 3 種類のブロック:文字クラス(何にマッチするか)+ 量指定子(何回マッチするか)+ 位置/グループ化
- \d \w \s は最もよく使われる 3 つの文字クラスで、数字、単語文字、空白をカバー
- ゼロから書く必要はない:一般的なシナリオには成熟した正規表現パターンが再利用可能
- 貪欲 vs 怠惰:デフォルトは貪欲(多くマッチ)、
?を付けると怠惰(少なくマッチ)
次のステップ:
- 環境変数と PATH - システム設定を理解する
- SSH と鍵認証 - リモートサーバーへの安全な接続