正規表現とJSON

正規表現とJSONは一般的なデータ処理ツールです。このレッスンでは、Javaでの使用方法を学びます。

正規表現

正規表現は文字列の一致、検索、置換に使用されます。

基本構文

構文 説明
. 任意の文字 a.c は "abc" に一致
\d 数字 \d+ は "123" に一致
\w 単語文字 \w+ は "hello_123" に一致
\s 空白文字 \s+ はスペース/タブに一致
^ 開始 ^Hello は開始に一致
$ 終了 World$ は終了に一致
* 0回以上 ab*c は "ac", "abc" に一致
+ 1回以上 ab+c は "abc", "abbc" に一致
? 0回または1回 ab?c は "ac", "abc" に一致
{n} n回 a{3} は "aaa" に一致
{n,m} nからm回 a{2,4} は "aa", "aaa" に一致
[] 文字セット [abc] は "a", "b", "c" に一致
| または cat|dog は "cat" または "dog" に一致
() グループ (ab)+ は "ab", "abab" に一致

PatternとMatcher

JAVA
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexDemo {
    public static void main(String[] args) {
        String text = "メールアドレスはtest@example.com、電話番号は13812345678です";
        
        // メールアドレスを一致
        Pattern emailPattern = Pattern.compile("\\w+@\\w+\\.\\w+");
        Matcher emailMatcher = emailPattern.matcher(text);
        if (emailMatcher.find()) {
            System.out.println("メール: " + emailMatcher.group());
        }
        
        // 電話番号を一致
        Pattern phonePattern = Pattern.compile("1[3-9]\\d{9}");
        Matcher phoneMatcher = phonePattern.matcher(text);
        if (phoneMatcher.find()) {
            System.out.println("電話: " + phoneMatcher.group());
        }
    }
}

一般的なメソッド

JAVA
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class RegexMethods {
    public static void main(String[] args) {
        String text = "Hello 123 World 456 Java 789";
        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(text);
        
        // find(): 次の一致を見つける
        while (matcher.find()) {
            System.out.println("見つかりました: " + matcher.group());
            System.out.println("位置: " + matcher.start() + "-" + matcher.end());
        }
        
        // matches(): 完全一致
        System.out.println(Pattern.matches("\\d+", "123"));   // true
        System.out.println(Pattern.matches("\\d+", "123a"));  // false
        
        // split(): 分割
        String[] parts = "a,b,c".split(",");
        for (String part : parts) {
            System.out.println(part);
        }
        
        // replaceAll(): すべて置換
        String result = "Hello 123 World".replaceAll("\\d+", "***");
        System.out.println(result);  // Hello *** World
    }
}

例:一般的な正規表現パターン

JAVA
public class CommonRegex {
    public static void main(String[] args) {
        // メール検証
        String emailRegex = "^[\\w.-]+@[\\w.-]+\\.\\w+$";
        System.out.println(Pattern.matches(emailRegex, "test@example.com"));  // true
        
        // 電話番号検証
        String phoneRegex = "^1[3-9]\\d{9}$";
        System.out.println(Pattern.matches(phoneRegex, "13812345678"));  // true
        
        // 身分証検証
        String idCardRegex = "^\\d{17}[\\dXx]$";
        System.out.println(Pattern.matches(idCardRegex, "11010119900101001X"));  // true
        
        // IPアドレス検証
        String ipRegex = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$";
        System.out.println(Pattern.matches(ipRegex, "192.168.1.1"));  // true
    }
}
▶ 試してみよう

グループキャプチャ

JAVA
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GroupDemo {
    public static void main(String[] args) {
        String text = "2026-06-24";
        Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
        Matcher matcher = pattern.matcher(text);
        
        if (matcher.matches()) {
            System.out.println("完全な日付: " + matcher.group(0));  // 2026-06-24
            System.out.println("年: " + matcher.group(1));       // 2026
            System.out.println("月: " + matcher.group(2));       // 06
            System.out.println("日: " + matcher.group(3));       // 24
        }
    }
}

JSON処理

JSONは軽量なデータ交換フォーマットです。

手動JSON解析

JAVA
public class JsonParseDemo {
    public static void main(String[] args) {
        String json = "{\"name\":\"Alice\",\"age\":25,\"city\":\"Beijing\"}";
        
        // 簡単な解析(非推奨、実際のプロジェクトではライブラリを使用)
        json = json.replace("{", "").replace("}", "").replace("\"", "");
        String[] pairs = json.split(",");
        
        for (String pair : pairs) {
            String[] kv = pair.split(":");
            System.out.println(kv[0].trim() + " = " + kv[1].trim());
        }
    }
}

JSONライブラリの使用(Jackson)

JAVA
// Jackson依存関係を追加後
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonDemo {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        
        // オブジェクトからJSONへ
        User user = new User("Alice", 25, "Beijing");
        String json = mapper.writeValueAsString(user);
        System.out.println("JSON: " + json);
        // {"name":"Alice","age":25,"city":"Beijing"}
        
        // JSONからオブジェクトへ
        User parsed = mapper.readValue(json, User.class);
        System.out.println("オブジェクト: " + parsed);
    }
}

class User {
    private String name;
    private int age;
    private String city;
    
    public User() {}  // Jacksonは引数なしコンストラクタが必要
    
    public User(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
    
    // getter/setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getAge() { return age; }
    public void setAge(int age) { this.age = age; }
    public String getCity() { return city; }
    public void setCity(String city) { this.city = city; }
    
    @Override
    public String toString() {
        return "User{name='" + name + "', age=" + age + ", city='" + city + "'}";
    }
}

JSON配列

JAVA
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;

public class JsonArrayDemo {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        
        // JSON配列
        String json = "[{\"name\":\"Alice\",\"age\":25},{\"name\":\"Bob\",\"age\":30}]";
        
        // Listに解析
        List<User> users = mapper.readValue(json, new TypeReference<List<User>>() {});
        users.forEach(System.out::println);
        
        // ListからJSONへ
        String result = mapper.writeValueAsString(users);
        System.out.println(result);
    }
}

一般的なJSON操作

JAVA
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonNodeDemo {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        String json = "{\"name\":\"Alice\",\"age\":25,\"address\":{\"city\":\"Beijing\",\"zip\":\"100000\"}}";
        
        // JsonNodeに解析
        JsonNode node = mapper.readTree(json);
        
        // 値を取得
        System.out.println("name: " + node.get("name").asText());
        System.out.println("age: " + node.get("age").asInt());
        System.out.println("city: " + node.get("address").get("city").asText());
        
        // 存在をチェック
        System.out.println("has email: " + node.has("email"));
    }
}

文字列の正規表現メソッド

JAVA
public class StringRegex {
    public static void main(String[] args) {
        String text = "Hello 123 World 456";
        
        // matches(): 完全一致
        System.out.println("123".matches("\\d+"));  // true
        
        // replaceAll(): すべての一致を置換
        String result = text.replaceAll("\\d+", "***");
        System.out.println(result);  // Hello * World *
        
        // replaceFirst(): 最初の一致を置換
        String result2 = text.replaceFirst("\\d+", "***");
        System.out.println(result2);  // Hello *** World 456
        
        // split(): 分割
        String[] parts = "a,b,,c".split(",");  // 空の文字列を保持
        System.out.println(parts.length);  // 4
        
        String[] parts2 = "a,b,,c".split(",", -1);  // 末尾の空の文字列を保持
        System.out.println(parts2.length);  // 4
    }
}

❓ よくある質問

Q 正規表現を覚えるのが難しい場合はどうすればいいですか?
A 一般的なパターン(\d \w \s . * + ? [] ())を覚えてください。複雑なパターンはドキュメントを確認してください。
Q JavaではどのJSONライブラリを使用すべきですか?
A Jacksonが最も人気があります。Gsonも良い選択です。簡単なシナリオでは手動解析でも十分です。
Q 正規表現のパフォーマンスはどうですか?
A 簡単な正規表現は良いパフォーマンスを発揮します。複雑な正規表現はパフォーマンスの問題がある可能性があります。バックトラッキングを避けてください。

📖 まとめ

📝 演習

  1. メール検証: メール形式を検証するメソッドを作成
  2. テキスト抽出: HTMLからすべてのリンクを抽出
  3. JSON解析: JSON文字列を解析し、特定のフィールドを抽出

次のレッスン

次のレッスンでは、総合プロジェクトを学びます — 完全なJavaプロジェクトを構築します。

100%