التعابير النمطية باستخدام Pattern وMatcher
تحقق من عناوين البريد الإلكتروني، واستخرج السلاسل الفرعية، واستبدل الأنماط باستخدام regex في Java
التعابير النمطية باستخدام Pattern وMatcher درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
التعبيرات النمطية باستخدام Pattern وMatcher
توفر الحزمة java.util.regex في Java الفئتين Pattern وMatcher لإجراء مطابقة النصوص والتحقق منها واستخراجها واستبدالها بطريقة قوية.
لماذا نستخدم التعبيرات النمطية؟
التعبيرات النمطية (regex) هي أنماط لمطابقة النصوص. وتُستخدم في Java للتحقق من عناوين البريد الإلكتروني وأرقام الهواتف، واستخراج البيانات من السجلات، وتحليل النصوص ذات البنية المحددة.
import java.util.regex.*;
// Is this a valid email?
String email = "alice@example.com";
boolean valid = email.matches("[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}");
System.out.println(valid); // true
// Extract version numbers from a string
String log = "App v1.2.3 deployed; api v2.0.0 started";
Pattern p = Pattern.compile("v(\\d+\\.\\d+\\.\\d+)");
Matcher m = p.matcher(log);
while (m.find()) System.out.println(m.group(1));
// 1.2.3
// 2.0.0أساسيات صياغة regex
أهم المحارف الفوقية في regex:
.— أي محرف\d— رقم؛\w— محرف كلمة؛\s— مسافة بيضاء*— صفر أو أكثر؛+— واحد أو أكثر؛?— صفر أو واحد{n,m}— من n إلى m مرات^/$— بداية السطر/نهايته[abc]— فئة محارف
// In Java strings, backslash must be doubled: \d = "\\d"
Pattern digit = Pattern.compile("\\d+"); // one or more digits
Pattern word = Pattern.compile("\\w{3,20}"); // 3-20 word chars
Pattern space = Pattern.compile("\\s+"); // whitespace
Pattern phone = Pattern.compile("\\d{3}-\\d{3}-\\d{4}"); // 555-867-5309
System.out.println(digit.matcher("42").matches()); // true
System.out.println(phone.matcher("555-867-5309").matches()); // truePattern.compile وMatcher
جمّعوا النمط مرة واحدة وأعيدوا استخدام Matcher مع مدخلات متعددة، فهذا أكثر كفاءة من استخدام String.matches() عند تكرار التحقق.
import java.util.regex.*;
Pattern emailPattern = Pattern.compile(
"^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,6}$"
);
String[] emails = {"alice@example.com", "bad@", "test.user@co.uk", "no-at-sign"};
for (String e : emails) {
Matcher m = emailPattern.matcher(e);
System.out.println(e + " -> " + (m.matches() ? "valid" : "invalid"));
}find() مقابل matches()
يختبر matches() السلسلة النصية بأكملها. أما find() فيبحث عن التواجد التالي داخل السلسلة النصية. استخدموا find للبحث وmatches للتحقق من السلسلة كاملة.
import java.util.regex.*;
Pattern price = Pattern.compile("\\d+\\.\\d{2}");
String invoice = "Total: 129.99, Tax: 10.40, Shipping: 5.00";
Matcher m = invoice.matcher(invoice);
// find() locates all matches
while (m.find()) {
System.out.println("Found: " + m.group() + " at " + m.start());
}
// Found: 129.99 at 7
// Found: 10.40 at 20
// Found: 5.00 at 34مجموعات الالتقاط
تنشئ الأقواس مجموعات التقاط. استخدموا group(n) لاستخراج السلاسل الفرعية المطابقة.
import java.util.regex.*;
Pattern date = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})");
Matcher m = date.matcher("Deployed on 2024-06-15 and 2024-07-01");
while (m.find()) {
String year = m.group(1);
String month = m.group(2);
String day = m.group(3);
System.out.println(year + "/" + month + "/" + day);
}
// 2024/06/15
// 2024/07/01المجموعات المسماة
تجعل المجموعات المسماة (?<name>...) مجموعات الالتقاط أكثر وضوحًا، وتتيح الوصول إليها بالاسم.
import java.util.regex.*;
Pattern log = Pattern.compile(
"(?<timestamp>\\d{4}-\\d{2}-\\d{2}) (?<level>[A-Z]+) (?<message>.+)"
);
String line = "2024-06-15 ERROR Database connection failed";
Matcher m = log.matcher(line);
if (m.matches()) {
System.out.println("Time: " + m.group("timestamp"));
System.out.println("Level: " + m.group("level"));
System.out.println("Message: " + m.group("message"));
}
// Time: 2024-06-15
// Level: ERROR
// Message: Database connection failedreplaceAll وreplaceFirst
الاستبدال القائم على النمط: استبدلوا جميع التواجدات أو التواجد الأول فقط.
import java.util.regex.*;
String text = "Call us at 123-456-7890 or 098-765-4321";
// Mask phone numbers for privacy logs
String masked = text.replaceAll("\\d{3}-\\d{3}-\\d{4}", "XXX-XXX-XXXX");
System.out.println(masked);
// Call us at XXX-XXX-XXXX or XXX-XXX-XXXX
// Replace multiple whitespace with single space
String cleaned = "too many spaces".replaceAll("\\s+", " ");
System.out.println(cleaned); // too many spacessplit() مع regex
يقبل String.split() تعبيرًا نمطيًا. استخدموه للتقسيم عند وجود فواصل متعددة أو فواصل معقدة.
// Split on comma with optional spaces
String csv = "Alice, Bob, Charlie,Diana";
String[] names = csv.split("\\s*,\\s*");
for (String name : names) System.out.println("'" + name + "'");
// 'Alice' 'Bob' 'Charlie' 'Diana'
// Split on any whitespace
String words = "one two\tthree four";
String[] parts = words.split("\\s+");
System.out.println(parts.length); // 4
// Limit splits
String line = "key=value=extra";
String[] kv = line.split("=", 2); // [key, value=extra]أعلام Pattern
تعدّل الأعلام سلوك regex: CASE_INSENSITIVE وMULTILINE وDOTALL.
import java.util.regex.*;
// Case-insensitive match
Pattern p = Pattern.compile("hello", Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("HELLO World").find()); // true
// MULTILINE: ^ and $ match line boundaries
Pattern multi = Pattern.compile("^ERROR", Pattern.MULTILINE);
String logs = "INFO start\nERROR crash\nINFO end";
Matcher m = multi.matcher(logs);
int count = 0;
while (m.find()) count++;
System.out.println("ERROR lines: " + count); // 1تطبيق عملي: محلل السجلات
تحليل أسطر سجلات الوصول بأسلوب Apache باستخدام مجموعات مسماة.
import java.util.regex.*;
Pattern accessLog = Pattern.compile(
"(?<ip>[\\d.]+) - - \\[(?<time>[^\\]]+)\\] " +
"\"(?<method>[A-Z]+) (?<path>[^ ]+)[^\"]*\" " +
"(?<status>\\d{3}) (?<bytes>\\d+)"
);
String line = "192.168.1.1 - - [27/May/2024:10:30:00 +0000] \"GET /api/products HTTP/1.1\" 200 1024";
Matcher m = accessLog.matcher(line);
if (m.matches()) {
System.out.println("IP: " + m.group("ip"));
System.out.println("Method: " + m.group("method"));
System.out.println("Status: " + m.group("status"));
}تحقق سريع
ما الفرق بين matches() وfind() في Matcher؟
مراجعة: التعبيرات النمطية باستخدام Pattern وMatcher
أهم النقاط:
- يجمّع Pattern.compile() تعبيرًا نمطيًا؛ ويختبر Matcher هذا التعبير مقابل السلاسل النصية
- يتحقق matches() من السلسلة النصية بأكملها؛ بينما يبحث find() عن التواجدات
- تستخرج مجموعات الالتقاط () السلاسل الفرعية؛ ويمكن الوصول إليها باستخدام group(n) أو group("name")
- تجعل المجموعات المسماة (?
...) الأنماط أكثر وضوحًا - يقبل replaceAll() وsplit() أنماط regex لإجراء معالجة مرنة للنصوص
- استخدموا أعلام Pattern.CASE_INSENSITIVE وMULTILINE وDOTALL لتعديل سلوك المطابقة
الأسئلة الشائعة
هل درس «التعابير النمطية باستخدام Pattern وMatcher» مجاني؟
نعم — نص درس «التعابير النمطية باستخدام Pattern وMatcher» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «التعابير النمطية باستخدام Pattern وMatcher»؟
تحقق من عناوين البريد الإلكتروني، واستخرج السلاسل الفرعية، واستبدل الأنماط باستخدام regex في Java تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التعابير النمطية باستخدام Pattern وMatcher»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عدم قابلية String للتغيير ومجمّع السلاسل النصية
- StringBuilder للضم الفعّال
- كتل النص وString.format
- التعابير النمطية باستخدام Pattern وMatcher