التعبيرات المنتظمة في Java: من الأساسيات إلى الاستخدام المتقدم
التعبيرات المنتظمة (regex) هي أداة قوية للعمل مع النصوص، تتيح إجراء البحث والاستبدال والتحقق من السلاسل النصية وفق أنماط معقدة. في Java، يتم دعم التعبيرات المنتظمة من خلال الحزمة java.util.regex، والتي توفر فئتين رئيسيتين: Pattern (لتجميع النمط) و Matcher (لتنفيذ عمليات البحث/الاستبدال).
في هذه المقالة، سنشرح كيفية استخدام التعبيرات المنتظمة في Java بفعالية، بدءًا من الصياغة الأساسية وصولاً إلى أمثلة واقعية من ممارسات التطوير.
1. أساسيات صياغة التعبيرات المنتظمة في Java
قبل الانتقال إلى كود Java، من المهم إتقان الرموز الوصفية الأساسية للتعبيرات المنتظمة:
.— أي حرف منفرد (باستثناء فاصل السطر)\\d— أي رقم (0-9)\\w— حرف أو رقم أو شرطة سفلية\\s— حرف مسافة (مسافة، تبويب، سطر جديد)*— 0 أو أكثر من التكرارات للحرف السابق+— 1 أو أكثر من التكرارات?— 0 أو 1 تكرار (يجعل الحرف اختياريًا)^— بداية السطر$— نهاية السطر[...]— فئة حرفية (مثال:[a-z]— جميع الأحرف الصغيرة)(...)— مجموعة التقاط
هام: في Java، تتطلب السلاسل النصية التي تحتوي على تعبيرات منتظمة هروبًا مزدوجًا. على سبيل المثال، لاستخدام \\d، نكتب في الكود "\\\\d". وذلك لأن الشرطة المائلة العكسية تُعالج أولاً بواسطة مترجم Java، ثم تُمرر إلى محرك التعبيرات المنتظمة.
2. الفئتان Pattern و Matcher — أساس العمل مع التعبيرات المنتظمة في Java
المخطط الأساسي للعمل مع التعبيرات المنتظمة في Java يتكون من ثلاث خطوات:
- إنشاء كائن
Patternعن طريق تجميع سلسلة النمط - إنشاء كائن
Matcherعن طريق استدعاء الأسلوبmatcher()على السلسلة التي نريد التحقق منها - تنفيذ العمليات — البحث، المطابقة، الاستبدال
مثال 1: التحقق من مطابقة السلسلة بأكملها
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class RegexExample { public static void main(String[] args) { // التحقق مما إذا كانت السلسلة عنوان بريد إلكتروني صحيح String email = "user@example.com"; String emailPattern = "^[A-Za-z0-9+_.-]+@(.+)$"; Pattern pattern = Pattern.compile(emailPattern); Matcher matcher = pattern.matcher(email); if (matcher.matches()) { System.out.println("البريد الإلكتروني صحيح"); } else { System.out.println("البريد الإلكتروني غير صحيح"); } }}الأسلوب matches() يحاول مطابقة النمط مع السلسلة بأكملها. إذا كنت بحاجة للتحقق مما إذا كانت السلسلة تحتوي على تطابق مع النمط (وليس بالضرورة بالكامل)، يتم استخدام الأسلوب find().
مثال 2: البحث عن جميع تكرارات النمط في السلسلة
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class FindExample { public static void main(String[] args) { String text = "Java 8, Java 11, Java 17 — هذه إصدارات لغة Java"; String regex = "Java\\\\s+\\\\d+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("تم العثور على: " + matcher.group() + " (الموضع: " + matcher.start() + "-" + matcher.end() + ")"); } }}نتيجة التنفيذ:
تم العثور على: Java 8 (الموضع: 0-6)تم العثور على: Java 11 (الموضع: 8-15)