٢٥ مارس ٢٠٢١

التخطى, الرموز الخاصة

كما رأينا, الشرطة المائلة للخلف \ تستخدم للدلالة على فئات الرموز,على سبيل المثال d\. لذلك فهى رمز خاص فى المصطلحات العادية (تمام كما هو الحال فى النصوص العادية).

هناك رموز خاصة أخرى كذلك, التى لها معنى خاص فى المصطلحات العادية. يتم استخدامها لإجراء عمليات بحث أكثر قوة . فيما يلى قائمة كاملة بها: [\ ^ $ . | ? * + ( ).

لا تحاول تذكر القائمة – قريبا سنتعامل مع كل منهم على حدة وستعرفهم عن ظهر قلب تلقائيًا

التخطى

لنفترض أننا نريد إيجاد نقطة حرفيا. ليس “اى حرف” لكن مجرد نقطة.

لاستخدام رمز خاص كرمز عادى, ضع قبلها شرطة مائلة للخلف: .\.

هذا يسمى أيضا “تخطى الرموز”.

فمثلا:

alert('الفصل 5.1'.match(/\d\.\d/)); // 5.1 (تطابق!)
alert('الفصل 511'.match(/\d\.\d/)); // null (البحث عن نقطة حقيقية \.)

الأقواس أيضا رموز خاصة, لذلك إذا أردناهم, يجب استخدام )\. المثال أدناه يبحث عن "()g":

alert('function g()'.match(/g\(\)/)); // "g()"

إذا كنا نبحث عن الشرطة المائلة للخلف \,إنها رمز خاص فى كلتا النصوص العادية و المصطلحات العادية, لذلك يجب أن نضاعفها.

alert('1\\2'.match(/\\/)); // '\'

الشرطة المائلة

رمز الشرطة المائلة '/' ليس رمز خاص ولكن فى جافا سكريبت يتم استخدامه لفتح وإغلاق المصطلح العام: /...نمط.../,لذلك يجب تخطيها أيضا.

هذا ما يبدو عليه البحث عن الشرطة المائلة '/':

alert('/'.match(/\//)); // '/'

من ناحية أخرى إذا كنا لا نستخدم /.../, ولكن قمنا بإنشاء مصطلع عام باستخدام new RegExp, فلا داعى لتخطيها:

alert('/'.match(new RegExp('/'))); // وجدت /

new RegExp

إذا كنا بصدد إنشاء تعبير عادي باستخدام new RegExp, كذلك لا يمكن تخطى /, ولكن بحاجة الى استخدام تخطى أخر.

فمثلا, ضع فى اعتبارك هذا:

let regexp = new RegExp('d.d');

alert('الفصل 5.1'.match(regexp)); // null

البحث المماثل في أحد الأمثلة السابقة يعمل مع /\d\.\d/, ولكن new RegExp("\d\.\d") لا يعمل , لماذا؟

السبب هوا أن الشرط المائلة “تستهلك” بواسطة النص, كما قد نتذكر, النصوص العادية لديها رموز خاصة بها, مثل n\, والشرطة المائلة للخلف تستخدم فى التخطى.

إليك كيف ينظر الى “\d.\d” :

alert('d.d'); // d.d

النصوص الاقتباسية “تستهلك” الشرط المائلة للخلف وتفسرهم لأنفسهم, فمثلا:

  • n\ – يضع سطر جديد,
  • u1234\ – يصبح رمز اليونيكود بالرقم المحدد,
  • … وعندما لا يكون هناك معنى خاص: مثل d\ أو z\, عندئذ يتم إزالة الشرطة المائلة للخلف ببساطة.

لذلك new RegExp تحصل على النصوص بلا شرط مائلة للخلف. لهذا السبب لا يعمل البحث

ولإصلاحها ، نحتاج إلى مضاعفة الشرط المائلة للخلف, لأن النصوص المقتبسة تحول \\ الى \:

let regStr = "\\d\\.\\d";
alert(regStr); // \d\.\d (صحيحة)

let regexp = new RegExp(regStr);

alert( "الفصل 5.1".match(regexp) ); // 5.1

الملخص

  • To search for special characters [ \ ^ $ . | ? * + ( ) literally, we need to prepend them with a backslash \ (“escape them”).
  • We also need to escape / if we’re inside /.../ (but not inside new RegExp).
  • When passing a string to new RegExp, we need to double backslashes \\, cause string quotes consume one of them.
خريطة الدورة التعليمية

التعليقات

إقرأ هذا قبل أن تضع تعليقًا…
  • إذا كان لديك اقتراحات أو تريد تحسينًا - من فضلك من فضلك إفتح موضوعًا فى جيتهاب أو شارك بنفسك بدلًا من التعليقات.
  • إذا لم تستطع أن تفهم شيئّا فى المقال - وضّح ماهو.
  • إذا كنت تريد عرض كود استخدم عنصر <code> ، وللكثير من السطور استخدم <pre>، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)