ترجمة الأنماط
Pattern.compile وMatcher
ترجمة الأنماط درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
زوج Pattern وMatcher
توجد التعابير النمطية في Java ضمن java.util.regex. يمثّل Pattern تعبيرًا نمطيًا مُجمَّعًا، بينما يطبّق Matcher ذلك النمط على إدخال محدد.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("abc123");
System.out.println(m.find());
}
}التجميع مرة واحدة وإعادة الاستخدام مرارًا
يُعدّ Pattern.compile مكلفًا نسبيًا. اجمع النمط مرة واحدة وأعد استخدامه مع العديد من المدخلات بدلًا من إعادة تجميعه داخل حلقة.
import java.util.regex.Pattern;
public class Main {
static final Pattern DIGITS = Pattern.compile("\\d+");
public static void main(String[] args) {
System.out.println(DIGITS.matcher("a1").find());
System.out.println(DIGITS.matcher("bb").find());
}
}تهريب الشرطات المائلة العكسية في Java
تحتاج رموز Regex مثل \d إلى شرطة مائلة عكسية، لكن سلاسل Java تستخدم الشرطة المائلة العكسية أيضًا لتسلسلات الهروب. لذلك تكتب في الشيفرة المصدرية \\d للدلالة على Regex \d.
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern word = Pattern.compile("\\w+");
System.out.println(word.matcher("hello").matches());
}
}إنشاء Matcher
يربط pattern.matcher(input) النمط بسلسلة إدخال ويعيد كائن Matcher جديدًا يتتبّع الموضع.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("the cat sat");
System.out.println(m.find());
}
}كائنات Matcher تحتفظ بالحالة
يحتفظ Matcher بحالة قابلة للتغيير، مثل الموضع الحالي وآخر تطابق. أنشئ كائن Matcher جديدًا لكل إدخال، ولا تشارك كائنًا واحدًا بين الخيوط.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("\\d");
Matcher m = p.matcher("a1b2");
System.out.println(m.find());
System.out.println(m.find());
}
}الراية غير الحساسة لحالة الأحرف
مرّر الرايات كوسيط ثانٍ إلى compile. تتجاهل Pattern.CASE_INSENSITIVE حالة الأحرف.
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
System.out.println(p.matcher("I love JAVA").find());
}
}دمج الرايات
ادمج الرايات باستخدام عامل OR على مستوى البتات. نضيف هنا MULTILINE لكي تطابق المراسي كل سطر.
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("^a", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
Matcher m = p.matcher("apple\nApricot");
int count = 0;
while (m.find()) count++;
System.out.println(count);
}
}الاختصار الثابت matches
إن Pattern.matches(regex, input) دالة مساعدة تُستخدم مرة واحدة، إذ تجمع النمط وتختبره في استدعاء واحد. إنها مريحة، لكنها تعيد التجميع في كل مرة.
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
System.out.println(Pattern.matches("\\d{3}", "123"));
System.out.println(Pattern.matches("\\d{3}", "12"));
}
}التقسيم باستخدام Pattern
يمكن لـ Pattern مُجمّع تقسيم السلاسل عبر split، مع إعادة استخدام Regex المُجمّع نفسه بكفاءة.
import java.util.Arrays;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern comma = Pattern.compile("\\s*,\\s*");
String[] parts = comma.split("a, b ,c, d");
System.out.println(Arrays.toString(parts));
}
}فحص Pattern
تعيد pattern() سلسلة Regex الأصلية، بينما تعيد flags() الرايات النشطة على هيئة عدد صحيح.
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);
System.out.println(p.pattern());
System.out.println(p.flags());
}
}تؤدي الأنماط غير الصالحة إلى استثناء
يؤدي Regex غير السليم إلى طرح PatternSyntaxException في وقت compile، ما يتيح لك اكتشاف الأخطاء مبكرًا.
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class Main {
public static void main(String[] args) {
try {
Pattern.compile("[unclosed");
} catch (PatternSyntaxException e) {
System.out.println("Invalid regex");
}
}
}تحقق سريع
لماذا ينبغي تجميع Regex يُستخدم بكثرة في حقل Pattern ثابت؟
مراجعة
لقد جمّعت الأنماط:
- ينشئ
Pattern.compileنمطًا قابلًا لإعادة الاستخدام، غير قابل للتغيير وآمنًا للاستخدام مع الخيوط؛ بينما يربطهmatcherبإدخال. - اهرب الشرطات المائلة العكسية في Regex باستخدام
\\في شيفرة Java المصدرية. - تُدمج الرايات مثل
CASE_INSENSITIVEوMULTILINEباستخدام OR على مستوى البتات. - يحتفظ
Matcherبالحالة، لذا أنشئ كائنًا واحدًا لكل إدخال.
الأسئلة الشائعة
هل درس «ترجمة الأنماط» مجاني؟
نعم — نص درس «ترجمة الأنماط» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «ترجمة الأنماط»؟
Pattern.compile وMatcher تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «ترجمة الأنماط»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.