طريقة الاستخدام
- اكتب النمط دون الشرطات المائلة. يجد المثال التواريخ المكتوبة بالصيغة 2026-11-10.
- حدّد الأعلام التي تحتاجها. g يجد كل التطابقات، وi يتجاهل حالة الأحرف الكبيرة والصغيرة، وm وs يغيّران طريقة قراءة فواصل الأسطر.
- الصق نص الاختبار. تُظلَّل التطابقات فوراً، وتعطي القائمة تحت النص موضع كل تطابق ومجموعاته.
- اكتب نصاً في الاستبدال بـ لترى النتيجة، ثم اضغط نسخ لتأخذها.
كيف تعمل المطابقة هنا
تستخدم الصفحة محرك التعبيرات النمطية المدمج في متصفحك، وهو المحرك نفسه الذي تستخدمه JavaScript. وتُوجد التطابقات بالترتيب من بداية النص. والموضع المعروض هو عدد الأحرف قبل التطابق بدءاً من 0، ويُحسب بوحدات UTF-16 كما تحسب JavaScript النص.
يجري البحث في عامل خلفي في متصفحك، فتبقى الصفحة مستجيبة. ويتوقف البحث بعد 10,000 تطابق، ولا يُبحث في نص أطول من 200,000 حرف. والنمط الذي قد لا يطابق شيئاً، مثل x*، ينتقل حرفاً واحداً بعد كل تطابق فارغ، فينتهي البحث دائماً. ويُوقف البحث الذي يستغرق أكثر من ثانيتين، انظر القسم عن الرجوع الكارثي.
- دون العلم g يُعرض التطابق الأول فقط، كما يفعل String.match().
- يقرأ العلم u الرمز التعبيري، أو أي حرف خارج المستوى الأساسي، حرفاً واحداً.
- يضيف العلم d بداية كل مجموعة ونهايتها إلى القائمة.
الرجوع الكارثي والحد البالغ ثانيتين
يجرّب محرك التعبيرات النمطية الطرق الممكنة لتطابق النمط، واحدة بعد أخرى. ومع بعض الأنماط، وأغلبها مجموعة متكررة داخل مجموعة متكررة مثل (a+)+، يتضاعف عدد الطرق بسرعة كبيرة: فكل حرف إضافي قد يضاعف العمل. ويحدث هذا أكثر ما يحدث حين يكاد النص يطابق، ويفشل في آخره فقط.
فمثلاً لا يمكن للنمط (a+)+$ أن يطابق نصاً فيه أحرف a كثيرة يتبعها رمز لا يطابق، مثل علامة التعجب، لأن $ يحتاج إلى نهاية النص. ومع ذلك يجرّب المحرك كل طريقة لتقسيم الأحرف قبل أن يستسلم. ومع نحو 26 حرفاً يمكن أن يستغرق البحث ثانية أو أكثر على حاسوب عادي، ويزداد البطء كثيراً مع كل حرف إضافي. والزمن يعتمد على جهازك.
تشغّل الصفحة كل بحث في عامل خلفي، وتوقفه بعد ثانيتين وتعرض رسالة. وتبقى بقية الصفحة تعمل، فيمكنك تغيير النمط أو النص والمحاولة مرة أخرى.
- لا تضع تكراراً داخل تكرار على الحروف نفسها: اكتب (a+)$ بدلاً من (a+)+$. وعلى النص نفسه ينتهي النمط الآمن فوراً.
- كن محدداً: استخدم [a-z] أو \d+ داخل المجموعة بدلاً من النقطة، حتى لا تتداخل أجزاء التطابق بطرق كثيرة.
- اختبر النمط أولاً على عينة قصيرة من النص، ثم على النص كله.
- ثبّت النمط حيث أمكن: فالحرف ^ في البداية و$ في النهاية يمنعان المحرك من تجربة كل نقطة بداية.
قواعد الاستبدال
يتبع نص الاستبدال قواعد String.replace() في JavaScript. وتبدأ علامة الدولار شيفرة تُستبدل بالنص المطابق:
| ما تكتبه | ويُستبدل بـ |
|---|---|
| $1 و$2 وهكذا | نص المجموعة المرقّمة |
| $& | التطابق كاملاً |
| $` | النص الذي قبل التطابق |
| $' | النص الذي بعد التطابق |
| $$ | علامة دولار واحدة |
| علامة دولار، ثم أصغر من، ثم اسم المجموعة، ثم أكبر من | نص المجموعة المسمّاة |
الفروق عن PCRE و.NET
يعمل النمط المكتوب لـ PCRE، في PHP وكثير من أدوات Linux، أو لـ .NET، في C# وVisual Basic، عادة هنا. لكن بعض الميزات موجودة في أحد المحركين فقط. ويعرض الجدول أهمها.
| الميزة | JavaScript (هذه الصفحة) | PCRE و.NET |
|---|---|---|
| المجموعات الذرّية والمكممات المالكة | غير متاحة | المجموعات الذرّية في PCRE وفي .NET، والمكممات المالكة مثل a++ في PCRE |
| المراسي \A و\Z و\z | غير متاحة: استخدم ^ و$ | متاحة |
| مجموعة مسمّاة مكتوبة (?P<…>) | غير متاحة | متاحة في PCRE |
| خيار داخلي مثل (?i) داخل النمط | غير متاح: اضبط العلم بدلاً منه | متاح في .NET |
| إبقاء النص خارج التطابق بالرمز \K | غير متاح | متاح في PCRE |
| استبدال مجموعة مسمّاة | علامة دولار، وأصغر من، والاسم، وأكبر من | .NET يستخدم علامة الدولار، ثم قوساً معقوفاً، ثم الاسم، ثم قوساً معقوفاً |
مثال محلول: ثلاثة تواريخ في نص واحد
للنمط النموذجي ثلاث مجموعات مسمّاة: أربع خانات للسنة، ثم خانتان للشهر وخانتان لليوم، مفصولة بشرطات. ويحتوي النص على ثلاثة تواريخ، وتتطابق عند الموضع 14 و34 و50، محسوبةً من 0 عند الحرف الأول.
مع نص الاستبدال يوم، شهر، سنة مكتوباً بأسماء المجموعات الثلاثة (علامة دولار، ثم أصغر من، والاسم، ثم أكبر من)، تُعاد كتابة التواريخ الثلاثة هكذا: 10.11.2026 و03.12.2026 و15.01.2027. والنتيجة تُقرأ: Invoice dated 10.11.2026, paid on 03.12.2026. Due 15.01.2027.
الأسئلة الشائعة
أي نكهة من التعبيرات النمطية يستخدمها هذا المختبر؟
يستخدم محرك JavaScript المدمج في متصفحك. وتعمل أغلب الأنماط الخاصة بالبحث والتحقق وتنظيف النص بالطريقة نفسها في JavaScript وPCRE و.NET، لكن بعض الميزات تختلف، كما يبيّن قسم الفروق.
لماذا تتوقف القائمة عند 10,000 تطابق؟
تُجمع التطابقات بالترتيب، والقائمة الطويلة جداً تكون بطيئة في الرسم وطويلة على القراءة. لذلك إذا تكرر النمط أكثر من ذلك، تُعرض أول 10,000 تطابق، وتقول الصفحة إن البحث توقف.
لماذا يُرفض نصي حين يزيد على 200,000 حرف؟
النص الطويل جداً يبطئ الصفحة، وقد يستغرق النمط وقتاً طويلاً عليه. اختبر النمط أولاً على جزء من النص، ثم على الباقي، أو قسّم النص إلى قطع أصغر.
لماذا يتخطى التظليل بعض التطابقات؟
التطابق الذي لا يحوي أي حرف، مثل المكان الفارغ الذي يجده x* بين الحروف، ليس فيه ما يُظلَّل. ويبقى في القائمة مع موضعه، فيمكنك أن ترى مكانه.
هل يُرسل المختبر نصي إلى خادم؟
لا. تجري المطابقة في متصفحك، ولا تحفظ الصفحة ما تكتبه ولا ترسله إلى أي جهة. وإغلاق الصفحة يمحوه.
ماذا تعني رسالة النمط غير الصالح؟
لا يمكن قراءة النمط كتعبير نمطي في JavaScript. وتأتي الرسالة من المحرك بالإنجليزية، وتسمّي المشكلة، مثل قوس لا يُغلق أبداً.
هل يمكن اختبار نمط مكتوب لـ PCRE أو .NET هنا؟
غالباً نعم، إذا استخدم ميزات شائعة فقط. فإذا كان فيه مجموعة ذرّية أو مكمم مالك أو \A أو \z أو خيار داخلي، فأعد كتابة ذلك الجزء لـ JavaScript أولاً، ويعرض الجدول الميزات المقصودة.
لماذا تقول الصفحة إن النمط استغرق وقتاً طويلاً؟
لم ينتهِ البحث خلال ثانيتين على هذا النص، فأوقفته الصفحة. وغالباً ما يعني ذلك نمطاً فيه تكرار داخل تكرار، مثل (a+)+، على نص يكاد يطابق. ويعرض القسم عن الرجوع الكارثي صيغة أكثر أماناً.
المصادر
- MDN: Regular expressions in JavaScript, including flags and groups (باللغة الإنجليزية)
- MDN: String.prototype.replace(), the replacement patterns (باللغة الإنجليزية)
- PCRE2 pattern syntax, the PCRE documentation (باللغة الإنجليزية)
- Microsoft: .NET regular expression language quick reference (باللغة الإنجليزية)
آخر مراجعة للأرقام والنص: الثلاثاء، 30 جمادى الأولى 1448 بعد الهجرة.