🔍 正規表現
文字列のパターンマッチング・検索・置換に使う表現法。grep / sed / JavaScript / Python などほぼ全ての言語で使える。
📌 基本メタ文字
| 記号 | 意味 | 例 |
|---|---|---|
. | 任意の1文字(改行除く) | a.c → abc, aXc |
* | 直前の要素を0回以上繰り返し | ab* → a, ab, abb |
+ | 直前の要素を1回以上繰り返し | ab+ → ab, abb |
? | 直前の要素を0または1回 | colou?r → color, colour |
^ | 行の先頭 | ^hello |
$ | 行の末尾 | end$ |
[...] | 文字クラス(いずれか1文字) | [aeiou] |
[^...] | 否定文字クラス | [^0-9] |
{n,m} | n〜m回繰り返し | \d{3,4} |
| | OR(選択) | cat|dog |
📌 文字クラス(エスケープ)
| 記号 | 意味 |
|---|---|
\d | 数字 [0-9] |
\D | 数字以外 |
\w | 英数字・アンダースコア [a-zA-Z0-9_] |
\W | \w 以外 |
\s | 空白文字(スペース・タブ・改行) |
\S | 空白以外 |
\b | 単語境界 |
\B | 単語境界以外 |
📌 グループと後方参照
| 記号 | 意味 |
|---|---|
(...) | キャプチャグループ |
(?:...) | 非キャプチャグループ |
\1, \2 | 後方参照(1番目・2番目グループ) |
(?<name>...) | 名前付きキャプチャ |
(?=...) | 肯定先読み |
(?!...) | 否定先読み |
(?<=...) | 肯定後読み |
(?<!...) | 否定後読み |
💡 実用パターン集
# メールアドレス検証
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
# 日本の電話番号
0\d{1,4}-\d{1,4}-\d{4}
# 日付 (YYYY-MM-DD)
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])
# URLの抽出
https?://[^\s"'<>]+
# IPアドレス
(?:\d{1,3}\.){3}\d{1,3}
# 郵便番号 (日本)
\d{3}-?\d{4}
💡 JavaScript での使い方
// テスト (true/false)
const re = /^\d{3}-\d{4}$/;
re.test('123-4567'); // true
// マッチ抽出
'2024-01-15'.match(/(\d{4})-(\d{2})-(\d{2})/);
// ['2024-01-15', '2024', '01', '15']
// 置換
'hello world'.replace(/\b\w/g, c => c.toUpperCase());
// 'Hello World'
// 全マッチ取得
const matches = [...'a1 b2 c3'.matchAll(/([a-z])(\d)/g)];
💡 grep / sed での使い方
# grep: パターンにマッチする行を表示
grep -E '\d{4}-\d{2}-\d{2}' log.txt
# grep: マッチしない行を表示 (-v)
grep -v '^#' config.txt
# sed: 置換 (g=全置換)
sed 's/foo/bar/g' file.txt
# sed: 後方参照で日付フォーマット変換
sed 's/\([0-9]\{4\}\)\/\([0-9]\{2\}\)/\1-\2/g' file.txt