مقدمة في التعبيرات المنتظمة في JavaScript
\nالتعبيرات المنتظمة (regex أو regexp) هي أداة قوية للبحث والاستبدال والتحقق من السلاسل النصية وفق نمط محدد. في JavaScript (و Node.js) يتم تنفيذها من خلال الكائن المدمج RegExp.
قد يبدو تركيب regex مخيفًا للمبتدئين، لكنه في الواقع مجرد لغة لوصف الأنماط. بإتقان التركيبات الأساسية، ستتمكن من:
\n- \n
- التحقق من صحة البريد الإلكتروني، رقم الهاتف، URL \n
- استخراج البيانات من النص (تحليل) \n
- استبدال السلاسل الفرعية وفق قواعد معقدة \n
- تصفية ومعالجة إدخال المستخدم \n
في هذه المقالة سنشرح التعبيرات المنتظمة في JavaScript مع أمثلة على Node.js. يمكن تشغيل جميع الأمثلة في وحدة التحكم أو في بيئة التشغيل.
\n\nإنشاء تعبير منتظم في JS
\nهناك طريقتان لإنشاء regex في JavaScript:
\n1. الصيغة الحرفية (موصى بها)
\nconst pattern = /hello/; // يبحث عن كلمة "hello"\nيتم وضع النمط بين شرطتين مائلتين. بعد الشرطة المائلة الختامية يمكن تحديد العلامات (مثل i — بحث غير حساس لحالة الأحرف).
2. المُنشئ RegExp
\nconst pattern = new RegExp('hello'); // مشابه لـ /hello/\nيُستخدم عندما يكون النمط ديناميكيًا (يتم تكوينه من متغير).
\n\nعلامات التعبيرات المنتظمة
\n- \n
i— تجاهل حالة الأحرف (/hello/iسيجد "Hello", "HELLO") \ng— بحث عام (يبحث عن جميع التطابقات، وليس الأولى فقط) \nm— وضع متعدد الأسطر (تغيير سلوك المراسي^و$) \ns— النقطة تطابق حرف السطر الجديد \nu— دعم Unicode \ny— بحث لاصق (يبحث فقط من موضع lastIndex) \n
const regex = /javascript/gi; // يبحث عن "javascript" بشكل عام ودون تمييز حالة الأحرف\n\nالطرق الأساسية للعمل مع regex في JavaScript
\nدعنا نستعرض الطرق الرئيسية المستخدمة مع التعبيرات المنتظمة.
\n\ntest() — التحقق من وجود النمط
\nتُرجع true أو false. أسرع طريقة للتحقق من الصحة.
const emailPattern = /^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,}$/i;\nconsole.log(emailPattern.test('user@example.com')); // true\nconsole.log(emailPattern.test('invalid-email')); // false\n\nexec() — بحث مع تفاصيل
\nتُرجع مصفوفة تحتوي على التطابق والمجموعات. مع العلامة g تتذكر الموضع.
const str = 'السعر: 100 روبل، الخصم: 20 روبل';\nconst pricePattern = /(\\d+)\\sروبل/g;\nlet match;\nwhile ((match = pricePattern.exec(str)) !== null) {\n console.log(`تم العثور على: ${match[0]}, الرقم: ${match[1]}`);\n}\n// الإخراج:\n// تم العثور على: 100 روبل, الرقم: 100\n// تم العثور على: 20 روبل, الرقم: 20\n\nmatch() — بحث في السلسلة النصية
\nطريقة السلسلة النصية. بدون العلامة g تُرجع أول تطابق (مثل exec). مع العلامة g — مصفوفة بجميع التطابقات.
const text = 'JS هو JavaScript، لا تخلطه مع Java.';\nconst jsMatches = text.match(/Java\\w*/g);\nconsole.log(jsMatches); // ['JavaScript', 'Java']\n\nreplace() — استبدال وفق النمط
\nيستبدل التطابقات بسلسلة نصية جديدة. يدعم الرموز الخاصة ($1, $&).
const phone = '+7 (123) 456-78-90';\nconst cleanPhone = phone.replace(/[\\s\\(\\)\\-]/g, '');\nconsole.log(cleanPhone); // +71234567890\n\n// استبدال باستخدام المجموعات\nconst date = '2024-03-15';\nconst reversed = date.replace(/(\\d{4})-(\\d{2})-(\\d{2})/, '$3.$2.$1');\nconsole.log(reversed); // 15.03.2024\n\nsearch() — فهرس أول تطابق
\nconst index = 'Hello world'.search(/world/);\nconsole.log(index); // 6