ゼロから学ぶ正規表現
1. 正規表現とは?
正規表現(Regex)は、特定のパターンを使って文字列を照合、検索、操作する強力なテキスト処理ツールです。プログラマー、データアナリスト、または日常のユーザーであっても、正規表現をマスターすることで、テキスト処理の効率を劇的に向上させることができます。
簡単な例:
\dは任意の数字(0-9)に一致します[a-z]は任意の小文字に一致します^helloは「hello」で始まる文字列に一致します
2. 基本的な構文要素
1. 文字のマッチング
- リテラル文字: はそれ自体に一致します。例:
aは文字「a」に一致します - ドット
.: は任意の単一文字に一致します(改行を除く) - 文字クラス
[]: は内部の任意の1つの文字に一致します。例:[aeiou]は任意の母音に一致します
2. 定義済みの文字クラス
\d: 数字、[0-9]と同等\w: 単語文字、[a-zA-Z0-9_]と同等\s: 空白文字(スペース、タブ、改行など)- 大文字の形式はクラスを否定します。例:
\Dは数字以外の文字に一致します
3. 量指定子
*: 0回以上+: 1回以上?: 0回または1回{n}: ちょうどn回{n,}: 少なくともn回{n,m}: n回からm回
4. アンカー
^: 文字列の先頭$: 文字列の末尾\b: 単語の境界
3. 実践的な例
1. メールアドレスの検証
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ パターンの内訳:
^- 文字列の先頭[a-zA-Z0-9._%+-]+- ユーザー名部分、文字、数字、特定の記号を許可@- 必須の@記号[a-zA-Z0-9.-]+- ドメイン部分\.- 必須のドット[a-zA-Z]{2,}$- TLD、少なくとも2文字
テストケース:
2. URLの抽出
(https?:\/\/(?:www\.)?[a-zA-Z0-9-]+\.[a-zA-Z]{2,}(?:\/[^\s]*)?) パターンの内訳:
https?- httpまたはhttpsに一致:\/\/- ://に一致(?:www\.)?- オプションのwww.[a-zA-Z0-9-]+- ドメイン本体\.[a-zA-Z]{2,}- トップレベルドメイン(?:\/[^\s]*)?- オプションのパス
テストケース:
3. 日付形式のマッチング(YYYY-MM-DD)
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$ パターンの内訳:
^\d{4}- 4桁の年(0[1-9]|1[0-2])- 月 01-12(0[1-9]|[12][0-9]|3[01])- 日 01-31$- 文字列の末尾
テストケース:
4. HTMLタグのコンテンツを抽出
<([a-z]+)(?:\s+[^>]*)?>(.*?)<\/\1> パターンの内訳:
<([a-z]+)- 開始タグ名に一致(?:\s+[^>]*)?- オプションの属性>(.*?)<\/\1>- 終了タグまでのコンテンツに一致.*?- 最小一致
テストケース:
This is a paragraph
5. パスワードの強度検証
要件:8〜20文字、大文字、小文字、数字、特殊文字を含む必要があります
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,20}$ パターンの内訳:
^- 文字列の先頭(?=.*[a-z])- 少なくとも1つの小文字(?=.*[A-Z])- 少なくとも1つの大文字(?=.*\d)- 少なくとも1つの数字(?=.*[@$!%*?&])- 少なくとも1つの特殊文字[A-Za-z\d@$!%*?&]{8,20}- 許可される文字と長さ$- 文字列の末尾
テストケース:
6. 中国語のテキストを抽出
[\u4e00-\u9fa5]+ パターンの内訳:
[\u4e00-\u9fa5]- Unicode CJKの範囲+- 1つ以上の中国語の文字
テストケース:
4. 高度なテクニック
1. キャプチャグループ
一致したコンテンツをキャプチャするには、() を使用します
(\d{3})-(\d{4}) 「123-4567」に一致し、「123」と「4567」を保存します
2. 非キャプチャグループ
キャプチャせずにグループ化するには、(?:...) を使用します
(?:www\.)?example\.com 3. 肯定/否定先読み
(?=...)肯定先読み\d+(?=px)「px」が続く数字に一致します
(?!...)否定先読み\d+(?!px)「px」が続かない数字に一致します
4. 貪欲 vs 遅延マッチング
- デフォルトは貪欲(できるだけ多く一致)
<.*>HTMLタグ全体とそのコンテンツに一致します
- 遅延(できるだけ少なく一致)するには、量指定子の後に
?を追加します<.*?>HTMLタグ自体のみに一致します
5. 学習リソースとツール
1. オンラインテストツール
- 🔗
Regex101
フル機能の正規表現テストおよび学習プラットフォーム
- 🔗
RegExr
ユーザーフレンドリーな正規表現学習ツール
- 🔗
RegexPal
シンプルな正規表現テスター
2. 練習プラットフォーム
- 🏆
RegexOne
インタラクティブな正規表現チュートリアル
- 🏆
HackerRank Regex Challenges
競争的プログラミングプラットフォームでの正規表現演習
3. 言語サポート
- 🐍
Python:
reモジュール - 🟨
JavaScript: built-in RegExp
- ☕
Java:
java.util.regexパッケージ - 🐘
PHP:
preg_関数