0Pricing
Java Academy · درس

مجموعات الالتقاط

استخراج السلاسل الفرعية المتطابقة

مجموعات الالتقاط درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

ماهيّة مجموعات الالتقاط

تنشئ الأقواس ( ) في Regex مجموعات التقاط. بعد حدوث تطابق، يمكنك استخراج نص كل مجموعة على حدة، وهذا مناسب لتحليل البيانات المهيكلة.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)-(\\d+)").matcher("42-99");
        if (m.find()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

المجموعة 0 هي التطابق الكامل

تعيد group(0) أو group() النص المتطابق بأكمله. وتبدأ المجموعات المرقّمة من 1.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)px").matcher("width: 24px");
        if (m.find()) {
            System.out.println(m.group(0));
            System.out.println(m.group(1));
        }
    }
}

عدّ المجموعات

تعرض groupCount() عدد مجموعات الالتقاط في النمط، من دون احتساب المجموعة 0.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
        if (m.find()) System.out.println(m.groupCount());
    }
}

تحليل تاريخ

تسهّل مجموعات الالتقاط تقسيم قيمة منسّقة إلى أجزائها.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})").matcher("2026-05-30");
        if (m.matches()) {
            System.out.println("year=" + m.group(1));
            System.out.println("month=" + m.group(2));
            System.out.println("day=" + m.group(3));
        }
    }
}

المجموعات المسماة

سمِّ المجموعة باستخدام (?<name>...) واسترجعها بالاسم. وهذا يجعل الأنماط أكثر قابلية للقراءة بكثير.

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

public class Main {
    public static void main(String[] args) {
        Pattern p = Pattern.compile("(?<user>\\w+)@(?<host>\\w+\\.\\w+)");
        Matcher m = p.matcher("alice@example.com");
        if (m.find()) {
            System.out.println(m.group("user"));
            System.out.println(m.group("host"));
        }
    }
}

حدود المجموعات

يعرض start(n) وend(n) نطاق فهارس مجموعة محددة داخل الإدخال.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)").matcher("abc123");
        if (m.find()) {
            System.out.println(m.start(1) + " to " + m.end(1));
        }
    }
}

المجموعات غير الملتقطة

استخدم (?:...) للتجميع من أجل التناوب أو المُكرّرات من دون إنشاء التقاط مرقّم. وبذلك تبقى أرقام المجموعات ذات معنى.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(?:Mr|Ms)\\.? (\\w+)").matcher("Ms. Smith");
        if (m.find()) System.out.println(m.group(1));
    }
}

قد تكون المجموعات الاختيارية بقيمة null

إذا كانت المجموعة اختيارية ولم تشارك في التطابق، فإن group(n) يعيد null. تعامل دائمًا مع هذه الحالة.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\d+)(px)?").matcher("50");
        if (m.matches()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

التكرار على التطابقات مع المجموعات

اجمع بين find داخل حلقة واستخراج المجموعات لاستخراج رموز مهيكلة من نص أكبر.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\w+)=(\\d+)").matcher("a=1 b=2 c=3");
        while (m.find()) {
            System.out.println(m.group(1) + " -> " + m.group(2));
        }
    }
}

المراجع الخلفية في النمط

يطابق \1 داخل Regex النص نفسه الذي التقطته مجموعة سابقة. ويتيح ذلك اكتشاف التكرار، مثل كلمة مكررة مرتين.

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

public class Main {
    public static void main(String[] args) {
        Matcher m = Pattern.compile("(\\w+) \\1").matcher("the the cat");
        System.out.println(m.find());
        System.out.println(m.group(1));
    }
}

التقاط البيانات في Records

النمط المنظم هو: طابق، ثم استخرج المجموعات، ثم أنشئ كائنًا صغيرًا. نستخدم هنا record.

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

public class Main {
    record Point(int x, int y) {}

    public static void main(String[] args) {
        Matcher m = Pattern.compile("\\((\\d+),(\\d+)\\)").matcher("(3,7)");
        if (m.matches()) {
            Point p = new Point(Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2)));
            System.out.println(p);
        }
    }
}

تحقق سريع

ماذا يعيد group(0) بعد نجاح التطابق؟

مراجعة

لقد استخرجت السلاسل الفرعية المتطابقة:

  • تنشئ الأقواس مجموعات مرقّمة؛ وتمثل group(0) التطابق الكامل، بينما تمثل الأرقام 1 وما بعدها مجموعات الالتقاط.
  • ينشئ (?<name>...) مجموعات مسماة تُقرأ عبر group("name").
  • يُجري (?:...) تجميعًا من دون التقاط.
  • قد تكون المجموعات الاختيارية null؛ ويشير \1 إلى مجموعة سابقة.

الأسئلة الشائعة

هل درس «مجموعات الالتقاط» مجاني؟

نعم — نص درس «مجموعات الالتقاط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «مجموعات الالتقاط»؟

استخراج السلاسل الفرعية المتطابقة تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «مجموعات الالتقاط»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ترجمة الأنماط
  2. البحث والمطابقة
  3. مجموعات الالتقاط
  4. الاستبدال باستخدام Regex
← العودة إلى Java Academy