正規表現をゼロから学ぶ:30分でマスターするテキスト処理
编程语言
なぜ正規表現を学ぶのか?
1行の正規表現で20行の文字列処理コードを置き換えられます。
1000行のログからすべてのIPアドレスを抽出する場合——通常のコードでは20行以上。正規表現なら:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} の1行で完了。
このチュートリアルは完全な初心者を想定しています。30分後には日常的なテキストマッチングの80%を処理できるようになります。
基本構文
リテラル文字とメタ文字
| 文字 | 意味 | 例 |
|---|---|---|
abc |
完全一致"abc" | hello → "hello"にマッチ |
. |
任意の1文字(改行除く) | h.t → hat, hot, hit |
\d |
数字 [0-9] | \d{3} → 123, 456 |
\w |
単語文字 [a-zA-Z0-9_] | \w+ → hello, test123 |
\s |
空白文字(スペース、タブ、改行) | a\sb → "a b" |
\D |
数字以外 | \D+ → hello |
\W |
単語文字以外 | \W → @, #, ! |
数量子
| 数量子 | 意味 | 例 |
|---|---|---|
* |
0回以上 | ab*c → ac, abc, abbc |
+ |
1回以上 | ab+c → abc, abbc(acを除く) |
? |
0回または1回 | colou?r → color, colour |
{n} |
ちょうどn回 | \d{4} → 4桁の数字 |
{n,} |
n回以上 | \d{4,} → 4桁以上の数字 |
{n,m} |
n回からm回 | \d{3,5} → 3〜5桁の数字 |
文字クラス
[a-z] 小文字
[A-Z] 大文字
[0-9] 数字
[a-zA-Z] すべてのアルファベット
[^0-9] 数字以外(^は[]内で否定を表す)
[abc] a、b、cのいずれか
アンカー
| アンカー | 意味 | 例 |
|---|---|---|
^ |
行頭 | ^Hello → Helloで始まる行 |
$ |
行末 | world$ → worldで終わる行 |
\b |
単語境界 | \bcat\b → 独立したcatのみ(catchは除外) |
グループ化とキャプチャ
(\d{3})-(\d{4})-(\d{4}) 電話番号 138-0000-1111 にマッチ
$1 = 138, $2 = 0000, $3 = 1111
ツール庫の正規表現ツールで置換機能を使うと:$1****$3 で中央4桁を 138-****-1111 にマスクできます。
非キャプチャグループ
(?:\d{3}) グループ化のみでキャプチャしない($1/$2は生成されない)
先読み・後読みアサーション(応用)
| 構文 | 意味 | 例 |
|---|---|---|
(?=...) |
後に...が続く | \d+(?=円) → "100円"の100にマッチ |
(?!...) |
後に...が続かない | \d+(?!円) → "100円"の100にはマッチしない |
(?<=...) |
前に...がある | (?<=¥)\d+ → "¥100"の100にマッチ |
(?<!...) |
前に...がない | (?<!¥)\d+ → "¥100"の100にはマッチしない |
実践レシピ
メール: [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
電話番号: 1[3-9]\d{9}
URL: https?://[^\s/$.?#].[^\s]*
身分証明書:\d{17}[\dXx]
中国語: [\u4e00-\u9fa5]
IPアドレス:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
日付: \d{4}-\d{2}-\d{2}
よくある落とし穴
1. 貪欲 vs 遅延
貪欲: <.*> "<div>hello</div>" → 文字列全体にマッチ(欲張り)
遅延: <.*?> "<div>hello</div>" → <div>と</div>のみマッチ
? を付けて数量子を遅延モードに。
2. 壊滅的バックトラッキング
# 危険な書き方
(a+)+b "aaaaaaaaaaaaaaaaaaaa" にマッチ → パフォーマンス爆発
# 安全な書き方
a+b 単純明快、数量子をネストしない
3. . は改行にマッチしない
# 複数行コンテンツのマッチ
[\s\S]* .* の代わりに(改行を含むすべての文字にマッチ)
応用レシピ集
ログ分析用
| シーン | 正規表現 | 説明 |
|---|---|---|
| Nginxアクセスログ | (\S+) - - \[([^\]]+)\] "([^"]*)" (\d+) (\d+) |
IP、時間、リクエスト、ステータス、バイト数 |
| Java例外スタック | (\w+Exception): (.+?)\n\s+at (.+) |
例外タイプ、メッセージ、呼び出し位置 |
| ISO 8601タイムスタンプ | \d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}[Z+-] |
ミリ秒単位のISOタイムスタンプ |
コードレビュー用
| シーン | 正規表現 | 説明 |
|---|---|---|
| Console.log残留 | console\.(log|warn|error|debug)\( |
デバッグコード検索 |
| TODO/FIXME | (TODO|FIXME|HACK|XXX): |
未完了タスクの検索 |
実践練習
ツール庫の正規表現テスターで以下の練習をしてみましょう:
- 「私の電話番号は138-1234-5678、オフィスは010-12345678です」からすべての電話番号を抽出
- 「2026-06-03」を「06/03/2026」に置換
- テキスト内の重複単語を検出
この3つの練習を完了すれば、正規表現の基礎はマスターです。テキスト置換やテキスト差分と組み合わせれば、テキスト処理能力が大きく向上します。
ブラウザローカルツールを無料で試す →
#正则表达式#Regex#文本处理#编程入门#开发工具