正規表現と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 簡単な正規表現は良いパフォーマンスを発揮します。複雑な正規表現はパフォーマンスの問題がある可能性があります。バックトラッキングを避けてください。
📖 まとめ
- 正規表現は文字列の一致、検索、置換に使用
- PatternとMatcherはJava正規表現のコアクラス
- JSONは軽量なデータ交換フォーマット
- JacksonはJavaで最も人気のあるJSONライブラリ
📝 演習
- メール検証: メール形式を検証するメソッドを作成
- テキスト抽出: HTMLからすべてのリンクを抽出
- JSON解析: JSON文字列を解析し、特定のフィールドを抽出
次のレッスン
次のレッスンでは、総合プロジェクトを学びます — 完全なJavaプロジェクトを構築します。



