Regex و JSON

Regex و JSON أدوات شائعة لمعالجة البيانات. في هذا الدرس، سنتعلم استخدامها في Java.

التعبيرات النمطية (Regex)

تُستخدم للمطابقة والبحث واستبدال النصوص.

الصيغة الأساسية

الصيغة الوصف مثال
. أي حرف a.c يطابق "abc"
\d رقم \d+ يطابق "123"
\w حرف كلمة \w+ يطابق "hello_123"
\s مسافة \s+ يطابق مسافات/tabs
^ بداية ^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، رقمي 0501234567";
        
        // مطابقة البريد
        Pattern emailPattern = Pattern.compile("\\w+@\\w+\\.\\w+");
        Matcher emailMatcher = emailPattern.matcher(text);
        if (emailMatcher.find()) {
            System.out.println("البريد: " + emailMatcher.group());
        }
        
        // مطابقة رقم الهاتف
        Pattern phonePattern = Pattern.compile("0[5]\\d{8}");
        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 = "مرحباً 123 عالم 456";
        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 = "مرحباً 123 عالم".replaceAll("\\d+", "***");
        System.out.println(result);  // مرحباً *** عالم
    }
}

مثال: أنماط Regex شائعة

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 = "^0[5]\\d{8}$";
        System.out.println(Pattern.matches(phoneRegex, "0501234567"));  // true
        
        // التحقق من IP
        String ipRegex = "^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\د\\د?)$";
        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-25";
        Pattern pattern = Pattern.compile("(\\د{4})-(\\د{2})-(\\د{2})");
        Matcher matcher = pattern.matcher(text);
        
        if (matcher.matches()) {
            System.out.println("التاريخ الكامل: " + matcher.group(0));  // 2026-06-25
            System.out.println("السنة: " + matcher.group(1));       // 2026
            System.out.println("الشهر: " + matcher.group(2));       // 06
            System.out.println("اليوم: " + matcher.group(3));       // 25
        }
    }
}

معالجة JSON

JSON هو صيغة خفيفة لتبادل البيانات.

تحليل JSON يدويًا

JAVA
public class JsonParseDemo {
    public static void main(String[] args) {
        String json = "{\"name\":\"أحمد\",\"age\":25,\"city\":\"الرياض\"}";
        
        // تحليل بسيط (غير موصى به، استخدم مكتبة في المشاريع الحقيقية)
        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("أحمد", 25، "الرياض");
        String json = mapper.writeValueAsString(user);
        System.out.println("JSON: " + json);
        // {"name":"أحمد","age":25,"city":"الرياض"}
        
        // 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;
    }
    
    // Getters/Setters
    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\":\"أحمد\",\"age\":25},{\"name\":\"محمد\",\"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\":\"أحمد\",\"age\":25,\"address\":{\"city\":\"الرياض\",\"zip\":\"12345\"}}";
        
        // تحليل إلى JsonNode
        JsonNode node = mapper.readTree(json);
        
        // الحصول على القيم
        System.out.println("الاسم: " + node.get("name").asText());
        System.out.println("العمر: " + node.get("age").asInt());
        System.out.println("المدينة: " + node.get("address").get("city").asText());
        
        // التحقق من الوجود
        System.out.println("يوجد بريد: " + node.has("email"));
    }
}

دوال Regex للنصوص

JAVA
public class StringRegex {
    public static void main(String[] args) {
        String text = "مرحباً 123 عالم 456";
        
        // matches(): مطابقة كاملة
        System.out.println("123".matches("\\d+"));  // true
        
        // replaceAll(): استبدال جميع المطابقات
        String result = text.replaceAll("\\d+", "***");
        System.out.println(result);  // مرحباً * عالم *
        
        // replaceFirst(): استبدال أول مطابقة
        String result2 = text.replaceFirst("\\d+", "***");
        System.out.println(result2);  // مرحباً *** عالم 456
        
        // split(): تقسيم
        String[] parts = "a,b,,c".split(",");  // يحتفظ بالنصوص الفارغة
        System.out.println(parts.length);  // 4
    }
}

❓ أسئلة شائعة

س Regex صعبة التذكر — ماذا أفعل؟
ج تذكر الأنماط الشائعة: \d \w \s . * + ? [] (). للأنماط المعقدة، راجع التوثيق.
س أي مكتبة JSON أستخدم في Java؟
ج Jackson هي الأكثر شعبية. Gson أيضًا جيدة. للسيناريوهات البسيطة، التحليل اليدوي يعمل.
س كيف أداء regex؟
ج ال.regex البسيطة أداءها جيد. المعقدة قد تكون هناك مشاكل في الأداء. تجنب الكثير من التراجع.

📖 ملخص

📝 تمارين

  1. تحقق من البريد: اكتب دالة تتحقق من صيغة البريد
  2. استخراج: استخرج جميع الروابط من HTML
  3. تحليل JSON: حلل نص JSON واستخرج حقولًا محددة

الدرس التالي

في الدرس التالي، سنتعلم مشروع شامل — بناء مشروع Java كامل.

100%