Home >Learn

ゼロから学ぶ正規表現

Published Updated

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]*)? - オプションのパス

テストケース:

https://example.com/pathhttp://www.site.org

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
  • $ - 文字列の末尾

テストケース:

2025-01-152025-12-312025-13-012025-02-30

4. HTMLタグのコンテンツを抽出

<([a-z]+)(?:\s+[^>]*)?>(.*?)<\/\1>

パターンの内訳:

  • <([a-z]+) - 開始タグ名に一致
  • (?:\s+[^>]*)? - オプションの属性
  • >(.*?)<\/\1> - 終了タグまでのコンテンツに一致
  • .*? - 最小一致

テストケース:

Hello

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} - 許可される文字と長さ
  • $ - 文字列の末尾

テストケース:

P@ssw0rdSecur3P@sspassword12345678

6. 中国語のテキストを抽出

[\u4e00-\u9fa5]+

パターンの内訳:

  • [\u4e00-\u9fa5] - Unicode CJKの範囲
  • + - 1つ以上の中国語の文字

テストケース:

这是一段中文文本123abc中文English混合

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_ 関数

Table of Contents

Information

  • Hits1109
  • Published date2025/10/12
0/500
Share your thoughts respectfully.

More Posts

Explore more articles from this section
Feedback email