التعبيرات النمطية في Java مع أمثلة
التعبيرات النمطية (regex) هي أداة قوية للبحث عن النص واستخراجه واستبداله وفقًا لنمط معين. في Java، يتم تنفيذ العمل مع التعبيرات النمطية من خلال الحزمة java.util.regex، والتي تتضمن فئتين رئيسيتين: Pattern (النمط) و Matcher (المطابق). في هذه المقالة، سنشرح بناء جملة التعبيرات النمطية، وطرق العمل بها، ونقدم أمثلة عملية في Java.
1. أساسيات بناء جملة التعبيرات النمطية
يحدد التعبير النمطي نمطًا للبحث عن السلاسل النصية. فيما يلي التركيبات الأساسية:
.— أي حرف (باستثناء سطر جديد).\\d— رقم (0-9).\\w— حرف أو رقم أو شرطة سفلية (للأحرف اللاتينية).\\s— حرف مسافة بيضاء (مسافة، علامة تبويب، سطر جديد).[abc]— أحد الأحرف a أو b أو c.[^abc]— أي حرف باستثناء a أو b أو c.*— صفر أو أكثر من التكرارات.+— تكرار واحد أو أكثر.?— صفر أو تكرار واحد.{n,m}— من n إلى m تكرارًا.^— بداية السلسلة النصية.$— نهاية السلسلة النصية.|— OR منطقي.()— مجموعة التقاط.
الهروب في Java: في القيم الحرفية النصية في Java، تعتبر الشرطة المائلة للخلف \\ حرف تحكم. لتمرير مثلاً \\d إلى regex، يجب كتابة "\\\\d". للنقطة — "\\\\.".
2. الفئتان Pattern و Matcher
يبدأ العمل مع التعبيرات النمطية في Java بتجميع النمط:
import java.util.regex.Pattern;import java.util.regex.Matcher;
public class RegexExample { public static void main(String[] args) { // تجميع النمط Pattern pattern = Pattern.compile("\\\\d+"); // إنشاء Matcher للسلسلة النصية Matcher matcher = pattern.matcher("السعر: 150 روبل، الخصم 20%"); // البحث عن جميع التطابقات while (matcher.find()) { System.out.println("تم العثور على: " + matcher.group()); } }}الإخراج:
تم العثور على: 150تم العثور على: 20الطرق الأساسية لـ Matcher:
find()— يبحث عن التطابق التالي (يمكن استدعاؤه عدة مرات).matches()— يتحقق مما إذا كانت السلسلة النصية بأكملها تطابق النمط (يتطلب تطابقًا كاملاً).lookingAt()— يتحقق مما إذا كانت السلسلة النصية تبدأ بالنمط.group()— يعيد السلسلة الفرعية التي تم العثور عليها (أو مجموعة محددة).groupCount()— عدد مجموعات الالتقاط.
3. أمثلة عملية
3.1. التحقق من صحة عنوان البريد الإلكتروني
لنتحقق مما إذا كانت السلسلة النصية هي بريد إلكتروني صحيح (نسخة مبسطة):
public class EmailValidator { public static boolean isValidEmail(String email) { String regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,}$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(email); return matcher.matches(); }
public static void main(String[] args) { System.out.println(isValidEmail("test@example.com")); // true System.out.println(isValidEmail("invalid-email")); // false }}شرح النمط:
^[a-zA-Z0-9._%+-]+— الجزء المحلي (أحرف، أرقام، نقاط، شرطات سفلية، إلخ).@— الرمز @.[a-zA-Z0-9.-]+— النطاق (أحرف، أرقام، نقاط، شرطات).\\\\.[a-zA-Z]{2,}$— النقطة ونطاق المستوى الأعلى (على الأقل حرفان).