正規表現チートシート:オンラインで逆引き!コピペOK の詳細な説明
正規表現(Regular Expression)は、テキストデータから特定のパターンに一致する文字列を検索、置換、抽出するために使用される強力なツールです。プログラミング、データ分析、テキストエディタなど、様々な場面で活用され、習得することで作業効率を飛躍的に向上させることができます。
しかし、正規表現は特殊な記号やルールを組み合わせるため、複雑で覚えにくいと感じる方も少なくありません。そこで、この記事では、正規表現の基本的な概念から、よく使うパターン、応用テクニックまでを網羅したチートシートを提供します。オンラインで逆引き可能で、コピペしてすぐに使えるコード例も多数掲載しているので、ぜひ活用してください。
目次
-
正規表現とは?
- 正規表現の基本的な概念
- 正規表現のメリット
- 正規表現が使える場所
-
正規表現の基本
- リテラル文字
- メタ文字
.
(ドット): 任意の1文字^
(キャレット): 行の先頭$
(ドル): 行の末尾*
(アスタリスク): 直前の文字の0回以上の繰り返し+
(プラス): 直前の文字の1回以上の繰り返し?
(クエスチョンマーク): 直前の文字の0回または1回の繰り返し{n}
: 直前の文字のn回の繰り返し{n,}
: 直前の文字のn回以上の繰り返し{n,m}
: 直前の文字のn回以上m回以下の繰り返し[]
(角括弧): 文字クラス[^]
(角括弧とキャレット): 否定の文字クラス|
(パイプ): OR (または)()
(丸括弧): グループ化
-
よく使う文字クラス
\d
: 数字 (0-9)\D
: 数字以外\w
: 英数字とアンダースコア (), [a-zA-Z0-9] と同じ\W
: 英数字とアンダースコア以外\s
: 空白文字 (スペース、タブ、改行など)\S
: 空白文字以外
-
アンカーと境界
^
: 行の先頭$
: 行の末尾\b
: 単語境界\B
: 単語境界以外
-
量指定子
*
: 0回以上の繰り返し (貪欲)+
: 1回以上の繰り返し (貪欲)?
: 0回または1回の繰り返し (貪欲){n}
: n回の繰り返し{n,}
: n回以上の繰り返し{n,m}
: n回以上m回以下の繰り返し*?
,+?
,??
: 非貪欲 (最小一致)
-
グループ化とキャプチャ
()
: グループ化- 後方参照:
\1
,\2
, … - 名前付きグループ:
(?P<name>...)
- 名前による参照:
(?P=name)
- 非キャプチャグループ:
(?:...)
-
先読みと後読み
- 肯定的な先読み:
(?=...)
- 否定的な先読み:
(?!...)
- 肯定的な後読み:
(?<=...)
- 否定的な後読み:
(?<!...)
- 肯定的な先読み:
-
正規表現フラグ
i
: 大文字と小文字を区別しないg
: グローバル (すべての一致を検索)m
: 複数行モードs
: ドット (.) を改行文字にも一致させるx
: コメントモード (空白とコメントを無視)
-
逆引きリファレンス
- 特定の文字列を含む行を検索
- メールアドレスの検証
- URLの検証
- 日付の検証
- HTMLタグの削除
- 特定の単語を置換
- IPアドレスの検証
- 郵便番号の検証
- 電話番号の検証
-
正規表現の応用テクニック
- 条件分岐
- 再帰的な正規表現
- アトミックグループ
-
正規表現の注意点
- パフォーマンス
- 複雑さ
- セキュリティ (ReDoS攻撃)
-
正規表現のテストツール
- オンライン正規表現テスター
-
まとめ
1. 正規表現とは?
-
正規表現の基本的な概念
正規表現は、特定のパターンを記述するための文字列です。このパターンは、テキストデータの中から一致する文字列を検索、置換、抽出するために使用されます。正規表現は、単なる文字列の一致だけでなく、より複雑なルールに基づいてパターンを表現できるため、非常に強力なツールとなります。
* 正規表現のメリット- 効率的な検索と置換: 大量のテキストデータから特定のパターンを効率的に検索し、置換することができます。
- 柔軟なパターン記述: 単純な文字列の一致だけでなく、複雑なルールに基づいてパターンを記述できます。
- 自動化: テキスト処理を自動化し、作業効率を向上させることができます。
- 汎用性: プログラミング言語、テキストエディタ、データベースなど、様々な環境で使用できます。
-
正規表現が使える場所
-
プログラミング: Python, JavaScript, Java, C#, Perl, PHP など、多くのプログラミング言語で正規表現をサポートしています。
- テキストエディタ: Visual Studio Code, Sublime Text, Atom など、多くのテキストエディタで正規表現を使用した検索と置換が可能です。
- データベース: MySQL, PostgreSQL, Oracle など、多くのデータベースで正規表現を使用したデータ検索が可能です。
- コマンドラインツール: grep, sed, awk などのコマンドラインツールで正規表現を使用できます。
- データ分析: R, Pandas などのデータ分析ツールで正規表現を使用して、データのクリーニングや抽出を行うことができます。
2. 正規表現の基本
-
リテラル文字
最も基本的な要素は、リテラル文字です。これは、検索したい文字列そのものを記述するものです。例えば、
hello
という正規表現は、文字列 “hello” に一致します。正規表現: hello
対象文字列: hello world
一致: hello -
メタ文字
メタ文字は、正規表現に特別な意味を与える記号です。これらを組み合わせることで、より複雑なパターンを表現できます。
-
.
(ドット): 任意の1文字ドットは、改行文字を除く任意の1文字に一致します。
正規表現: .at
対象文字列: cat bat hat mat sat
一致: cat, bat, hat, mat, sat -
^
(キャレット): 行の先頭キャレットは、行の先頭に一致します。
正規表現: ^hello
対象文字列: hello world
hello again
一致: hello (最初の行のみ) -
$
(ドル): 行の末尾ドルは、行の末尾に一致します。
正規表現: world$
対象文字列: hello world
the world
一致: world (最初の行のみ) -
*
(アスタリスク): 直前の文字の0回以上の繰り返しアスタリスクは、直前の文字が0回以上繰り返される場合に一致します。
正規表現: ab*c
対象文字列: ac abc abbc abbbc
一致: ac, abc, abbc, abbbc -
+
(プラス): 直前の文字の1回以上の繰り返しプラスは、直前の文字が1回以上繰り返される場合に一致します。
正規表現: ab+c
対象文字列: ac abc abbc abbbc
一致: abc, abbc, abbbc -
?
(クエスチョンマーク): 直前の文字の0回または1回の繰り返しクエスチョンマークは、直前の文字が0回または1回出現する場合に一致します。
正規表現: ab?c
対象文字列: ac abc abbc
一致: ac, abc -
{n}
: 直前の文字のn回の繰り返し{n}
は、直前の文字がちょうど n 回繰り返される場合に一致します。正規表現: a{3}b
対象文字列: aaab aabbb ab
一致: aaab -
{n,}
: 直前の文字のn回以上の繰り返し{n,}
は、直前の文字が n 回以上繰り返される場合に一致します。正規表現: a{2,}b
対象文字列: aab aaab aaaaaab ab
一致: aab, aaab, aaaaaab -
{n,m}
: 直前の文字のn回以上m回以下の繰り返し{n,m}
は、直前の文字が n 回以上 m 回以下繰り返される場合に一致します。正規表現: a{2,4}b
対象文字列: aab aaab aaaaab ab aaaaaab
一致: aab, aaab, aaaaab -
[]
(角括弧): 文字クラス角括弧は、文字クラスを定義します。角括弧内に記述された文字のいずれか1文字に一致します。
“`
正規表現: [aeiou]
対象文字列: apple banana orange
一致: a, e, i, o, u (すべての母音)正規表現: [0-9]
対象文字列: abc123def
一致: 1, 2, 3正規表現: [a-zA-Z]
対象文字列: AbCd123
一致: A, b, C, d
“` -
[^]
(角括弧とキャレット): 否定の文字クラス角括弧内のキャレットは、否定の文字クラスを定義します。角括弧内に記述された文字以外の任意の1文字に一致します。
正規表現: [^aeiou]
対象文字列: apple banana orange
一致: p, p, l, b, n, n, n, g -
|
(パイプ): OR (または)パイプは、複数のパターンをORで結合します。
正規表現: cat|dog
対象文字列: I have a cat and a dog.
一致: cat, dog -
()
(丸括弧): グループ化丸括弧は、パターンをグループ化します。グループ化されたパターンは、後方参照や量指定子を適用する際に便利です。
正規表現: (ab)+
対象文字列: ab abab ababab
一致: ab, abab, ababab
-
3. よく使う文字クラス
-
\d
: 数字 (0-9)正規表現: \d+
対象文字列: abc123def456
一致: 123, 456 -
\D
: 数字以外正規表現: \D+
対象文字列: abc123def456
一致: abc, def -
\w
: 英数字とアンダースコア (), [a-zA-Z0-9] と同じ正規表現: \w+
対象文字列: hello_world123
一致: hello_world123 -
\W
: 英数字とアンダースコア以外正規表現: \W+
対象文字列: hello world!
一致: , ! -
\s
: 空白文字 (スペース、タブ、改行など)正規表現: \s+
対象文字列: hello world
一致: , -
\S
: 空白文字以外正規表現: \S+
対象文字列: hello world
一致: hello, world
4. アンカーと境界
^
: 行の先頭 (上記参照)$
: 行の末尾 (上記参照)-
\b
: 単語境界単語境界は、単語の先頭または末尾に一致します。単語は、英数字とアンダースコアで構成される文字列と定義されます。
正規表現: \bcat\b
対象文字列: cat dog catalog
一致: cat (最初のcatのみ) -
\B
: 単語境界以外単語境界以外に一致します。
正規表現: \Bcat\B
対象文字列: cat dog catalog
一致: cat (catalogの中のcat)
5. 量指定子
*
: 0回以上の繰り返し (貪欲) (上記参照)+
: 1回以上の繰り返し (貪欲) (上記参照)?
: 0回または1回の繰り返し (貪欲) (上記参照){n}
: n回の繰り返し (上記参照){n,}
: n回以上の繰り返し (上記参照){n,m}
: n回以上m回以下の繰り返し (上記参照)-
*?
,+?
,??
: 非貪欲 (最小一致)量指定子は、デフォルトでは貪欲 (greedy) です。つまり、可能な限り長い文字列に一致しようとします。非貪欲な量指定子を使用すると、可能な限り短い文字列に一致します。
“`
正規表現: <.*> (貪欲)
対象文字列:This is a paragraph.
一致:
This is a paragraph.
正規表現: <.*?> (非貪欲)
対象文字列:This is a paragraph.
一致:
,
“`
6. グループ化とキャプチャ
()
: グループ化 (上記参照)-
後方参照:
\1
,\2
, …グループ化されたパターンは、後方参照を使用して再利用できます。
\1
は最初のグループ、\2
は2番目のグループに一致します。正規表現: (a+)b\1
対象文字列: aaba aaabba aaaaaaba
一致: aaba, aaabba, aaaaaaba -
名前付きグループ:
(?P<name>...)
グループに名前を付けることができます。
正規表現: (?P<prefix>\d{3})-(?P<suffix>\d{4})
対象文字列: 123-4567
一致: 123-4567
prefix: 123
suffix: 4567 -
名前による参照:
(?P=name)
名前付きグループを名前で参照できます。
正規表現: (?P<word>\w+) (?P=word)
対象文字列: hello hello world world
一致: hello hello, world world -
非キャプチャグループ:
(?:...)
グループ化はしたいが、後方参照に使用したくない場合に便利です。
正規表現: (?:ab)+
対象文字列: ab abab ababab
一致: ab, abab, ababab (グループはキャプチャされない)
7. 先読みと後読み
-
肯定的な先読み:
(?=...)
指定されたパターンの後に続く場合にのみ一致します。
正規表現: \w+(?=ing)
対象文字列: running swimming coding
一致: runn, swimm, cod -
否定的な先読み:
(?!...)
指定されたパターンの後に続かない場合にのみ一致します。
正規表現: \w+(?!ing)
対象文字列: running swimming coding hello world
一致: hello, world -
肯定的な後読み:
(?<=...)
指定されたパターンの前に存在する場合にのみ一致します。
正規表現: (?<=abc)\w+
対象文字列: abcdef abghi
一致: def -
否定的な後読み:
(?<!...)
指定されたパターンの前に存在しない場合にのみ一致します。
正規表現: (?<!abc)\w+
対象文字列: abcdef abghi def
一致: ghi, def
8. 正規表現フラグ
正規表現フラグは、正規表現の動作を制御します。
-
i
: 大文字と小文字を区別しない“`
正規表現: hello (フラグなし)
対象文字列: Hello world
一致: (なし)正規表現: hello (フラグ: i)
対象文字列: Hello world
一致: Hello
“` -
g
: グローバル (すべての一致を検索)“`
正規表現: cat (フラグなし)
対象文字列: cat cat cat
一致: cat (最初のcatのみ)正規表現: cat (フラグ: g)
対象文字列: cat cat cat
一致: cat, cat, cat (すべてのcat)
“` -
m
: 複数行モード^
と$
を文字列全体ではなく、各行の先頭と末尾に一致させます。“`
正規表現: ^cat$ (フラグなし)
対象文字列: cat\ndog\ncat
一致: (なし)正規表現: ^cat$ (フラグ: m)
対象文字列: cat\ndog\ncat
一致: cat, cat
“` -
s
: ドット (.) を改行文字にも一致させるデフォルトでは、ドットは改行文字に一致しません。
“`
正規表現: .* (フラグなし)
対象文字列: hello\nworld
一致: hello正規表現: .* (フラグ: s)
対象文字列: hello\nworld
一致: hello\nworld
“` -
x
: コメントモード (空白とコメントを無視)正規表現内に空白やコメントを記述できます。
正規表現: \d{3} #市外局番 - \d{4} #電話番号 (フラグ: x)
対象文字列: 123-4567
一致: 123-4567
9. 逆引きリファレンス
-
特定の文字列を含む行を検索:
正規表現: .*キーワード.*
例: .*error.* -
メールアドレスの検証:
正規表現: [a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
-
URLの検証:
正規表現: https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+
-
日付の検証 (YYYY-MM-DD形式):
正規表現: \d{4}-\d{2}-\d{2}
-
HTMLタグの削除:
正規表現: <[^>]+>
-
特定の単語を置換:
正規表現: (検索したい単語)
置換文字列: (置換後の単語)
例: (apple) -> (orange) -
IPアドレスの検証:
正規表現: ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
-
郵便番号の検証 (日本):
正規表現: \d{3}-\d{4}
-
電話番号の検証 (日本):
正規表現: 0\d{1,4}-\d{1,4}-\d{4}
10. 正規表現の応用テクニック
-
条件分岐
正規表現内で条件分岐を行うことができます。
正規表現: (?(条件)真の場合のパターン|偽の場合のパターン)
例: (?(?=[A-Z])^[A-Z]+$|^[a-z]+$) (大文字のみまたは小文字のみの文字列に一致) -
再帰的な正規表現
正規表現内で自分自身を再帰的に呼び出すことができます。
正規表現: \(([^()]|(?R))*\) (括弧で囲まれた文字列に一致)
-
アトミックグループ
バックトラックを抑制することで、パフォーマンスを向上させることができます。
正規表現: (?>a+b) (aが1回以上繰り返され、その後にbが続くパターン)
11. 正規表現の注意点
-
パフォーマンス
複雑な正規表現は、パフォーマンスに影響を与える可能性があります。特に、貪欲な量指定子やバックトラックが頻繁に発生する場合に注意が必要です。
-
複雑さ
複雑な正規表現は、可読性が低下し、メンテナンスが難しくなる可能性があります。できるだけシンプルで理解しやすい正規表現を記述するように心がけましょう。
-
セキュリティ (ReDoS攻撃)
特定の正規表現は、ReDoS (Regular Expression Denial of Service) 攻撃に対して脆弱である可能性があります。これは、正規表現エンジンがバックトラックを繰り返すことで、過剰なリソースを消費してしまう現象です。ReDoS攻撃を回避するためには、複雑なネスト構造や曖昧なパターンを避けることが重要です。
12. 正規表現のテストツール
-
オンライン正規表現テスター
正規表現をテストするためのオンラインツールが多数存在します。以下に代表的なものを紹介します。
これらのツールを使用することで、正規表現が意図した通りに動作するかどうかを簡単に確認できます。また、デバッグや学習にも役立ちます。
13. まとめ
正規表現は、テキスト処理において非常に強力なツールです。基本的な概念から応用テクニックまでを理解することで、作業効率を飛躍的に向上させることができます。この記事で紹介したチートシートを参考に、様々な場面で正規表現を活用してみてください。 重要なのは、実際に手を動かして試してみることです。オンラインの正規表現テスターなどを利用して、色々なパターンを試してみることで、より深く理解できるようになります。