التعبيرات المنتظمة في جافا مع أمثلة: عملياً

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التعبيرات المنتظمة في جافا: من النظرية إلى التطبيق

\n

التعبيرات المنتظمة (regex) هي أداة قوية للبحث والاستبدال والتحقق من صحة النصوص. في جافا، يتم التعامل معها من خلال حزمة java.util.regex، والتي تتضمن فئتين رئيسيتين: Pattern (النمط) و Matcher(المطابق). في هذه المقالة، سنشرح بناء الجملة والطرق الرئيسية ونعزز المعرفة بأمثلة كود حقيقية.

\n

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

\n\n

1. أساسيات العمل مع Pattern و Matcher

\n

يبدأ أي عمل مع regex في جافا بتجميع النمط من خلال Pattern.compile(). بعد ذلك، يتم إنشاء كائن Matcher الذي يطبق النمط على السلسلة النصية.

\n

لننظر إلى مثال بسيط: البحث عن جميع الأرقام في النص.

\n
import java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class RegexDemo {\n    public static void main(String[] args) {\n        String text = "Java الإصدار 21 صدر في عام 2023";\n        String regex = "\\\\d+"; // رقم واحد أو أكثر\n\n        Pattern pattern = Pattern.compile(regex);\n        Matcher matcher = pattern.matcher(text);\n\n        while (matcher.find()) {\n            System.out.println("تم العثور على: " + matcher.group());\n        }\n    }\n}
\n

مخرجات البرنامج:

\n
تم العثور على: 21\nتم العثور على: 2023
\n

لاحظ الشرطة المائلة المزدوجة \\\\d — في جافا، يتطلب النص الحرفي (string literal) الهروب من الخط المائل العكسي. إذا كنت بحاجة إلى تحديد \\d في regex، فاكتب \\\\d في الكود.

\n\n

2. بناء جملة التعبيرات المنتظمة: الرموز الوصفية والمحددات الكمية

\n

لاستخدام regex بفعالية، من المهم تذكر الرموز الوصفية الأساسية:

\n
    \n
  • . — أي حرف (باستثناء فاصل السطر);
  • \n
  • \\\\d — رقم (مكافئ لـ [0-9]);
  • \n
  • \\\\w — حرف أو رقم أو شرطة سفلية ([a-zA-Z0-9_]);
  • \n
  • \\\\s — حرف مسافة بيضاء;
  • \n
  • ^ — بداية السطر;
  • \n
  • $ — نهاية السطر.
  • \n
\n

تتحكم المحددات الكمية في عدد التكرارات:

\n
    \n
  • + — مرة واحدة أو أكثر;
  • \n
  • * — صفر مرة أو أكثر;
  • \n
  • ? — صفر أو مرة واحدة;
  • \n
  • {n} — n مرة بالضبط;
  • \n
  • {n,m} — من n إلى m مرة.
  • \n
\n

مثال: سنجد جميع الكلمات المكونة من أحرف لاتينية فقط، بطول يتراوح من 3 إلى 5 أحرف.

\n
String text = "Java regex example for beginners";\nString regex = "\\\\b[a-zA-Z]{3,5}\\\\b";\n\nPattern pattern = Pattern.compile(regex);\nMatcher matcher = pattern.matcher(text);\n\nwhile (matcher.find()) {\n    System.out.println(matcher.group());\n}\n// المخرجات: Java, regex, for
\n

حد الكلمة \\\\b يمنع التطابق الجزئي (على سبيل المثال، "Java" لن تكون جزءاً من "JavaScript").

\n\n

3. أمثلة عملية: التحقق من الصحة واستخراج البيانات

\n

ننتقل إلى المهام التي تظهر غالباً في التطوير الفعلي.

\n\n

3.1. التحقق من صحة عنوان البريد الإلكتروني

\n

أبسط فحص: وجود الرمز "@" والنطاق.

\n
public static boolean isValidEmail(String email) {\n    String regex = "^[\\\\w.-]+@[\\\\w.-]+\\\\.\\\\w{2,}$";\n    return Pattern.matches(regex, email);\n}\n\npublic static void main(String[] args) {\n    System.out.println(isValidEmail("user@example.com")); // true\n    System.out.println(isValidEmail("invalid-email"));    // false\n}
\n

الطريقة Pattern.matches() تتحقق تلقائياً من السلسلة بأكملها (مكافئة لـ matcher.matches()).

\n\n

3.2. استخراج أرقام الهواتف

\n

لنفترض أن النص يحتوي على أرقام بتنسيق "+7 (999) 123-45-67".

\n
String text = "جهة الاتصال: +7 (999) 123-45-67 ورقم آخر: +7 (495) 765-43-21";\nString regex = "\\\\+7\\\\s?\\\\(\\\\d{3}\\\\)\\\\s?\\\\d{3}-\\\\d{2}-\\\\d{2}";\n\nPattern pattern = Pattern.compile(regex);\nMatcher matcher = pattern.matcher(text);\n\nwhile (matcher.find()) {\n    System.out.println("رقم الهاتف: " + matcher.group());\n}\n// المخرجات:\n// رقم الهاتف: +7 (999) 123-45-67\n// رقم الهاتف: +7 (495) 765-43-21
\n

هنا نستخدم \\\\s? للإشارة إلى أن المسافة اختيارية، و \\\\d{3} لثلاثة أرقام بالضبط.

\n\n

3.3. استبدال النص باستخدام regex

\n

غالباً ما تكون هناك حاجة ليس فقط للبحث، ولكن أيضاً لاستبدال أجزاء من النص. على سبيل المثال، إخفاء أرقام بطاقات الائتمان.

\n
String text = "بطاقتي: 1234 5678 9012 3456";\nString regex = "\\\\d{4}\\\\s\\\\d{4}\\\\s\\\\d{4}\\\\s\\\\d{4}";\n\nString masked = text.replaceAll(regex, "**** **** **** 3456");\nSystem.out.println(masked);\n// المخرجات: بطاقتي: **** **** **** 3456
\n

الطريقة replaceAll() من فئة String تقبل regex كمعامل أول وسلسلة الاستبدال كمعامل ثانٍ.

\n\n

4. الأخطاء الشائعة ونصائح للتصحيح

\n

حتى المطورين ذوي الخبرة يرتكبون أخطاء عند العمل مع regex. إليك أكثرها شيوعاً:

\n
    \n
  • نسيان الهروب من الأحرف الخاصة: في جافا، يجب كتابة \\\\d بدلاً من \\d.
  • \n
  • عدم مراعاة حالة الأحرف: بشكل افتراضي، regex حساس لحالة الأحرف. استخدم Pattern.compile(regex, Pattern.CASE_INSENSITIVE) للتجاهل.
  • \n
  • استخدام matches() بدلاً من find(): الأول يتحقق من تطابق السلسلة بأكملها، والثاني يبحث عن تطابق جزئي.
  • \n
\n

نصيحة: استخدم أدوات مثل regex101.com لاختبار التعبيرات قبل كتابتها في الكود.

\n\n

الخلاصة

\n

التعبيرات المنتظمة في جافا هي أداة قوية ومرنة. على الرغم من أن بناء الجملة قد يبدو معقداً في البداية، إلا أن الممارسة المنتظمة ستساعدك على إتقانها بسرعة. ابدأ بأمثلة بسيطة، وقم بتعقيد المهام تدريجياً، ولا تنسَ اختبار تعبيراتك على بيانات حقيقية.

\n

إذا كان لديك أسئلة أو تريد اقتراح موضوع للمقالة التالية، اكتب في التعليقات! ولا تنسَ الاشتراك في تحديثات المدونة.

المدونات

توصيات الكتب