٨ يونيو ٢٠٢٠

المرجعيات الخلفية في النمط: \ N و \ k <name>

يمكننا استخدام محتويات نمط التقاط المجموعات: (…) `ليس فقط في النتيجة أو في سلسلة الاستبدال ، ولكن أيضًا في النمط نفسه.

المرجع حسب الرقم: \ N

يمكن الرجوع إلى مجموعة في النمط باستخدام \ N ، حيثN هو رقم المجموعة.

لتوضيح سبب ذلك ، دعنا نفكر في مهمة.

نحن بحاجة إلى العثور على السلاسل المقتبسة: إما “مفردة:” … “مفردة الاقتباس أو” موضوع “مزدوج الاقتباس:” … "- يجب أن يتطابق كلا الخيارين.

كيف تجدهم؟

يمكننا وضع كلا النوعين من الاقتباسات بين قوسين معقوفين: `` pattern: [‘’] (. *؟) [“]” ، لكنه سيجد سلاسل بعلامات اقتباس مختلطة ، مثل “match:” … “” و “المباراة:” … “”. سيؤدي ذلك إلى تطابقات غير صحيحة عندما يظهر اقتباس واحد داخل اقتباسات أخرى ، كما هو الحال في السلسلة “subject:” She is the one! ":

let str = `He said: "She's the one!".`;

let regexp = /['"](.*?)['"]/g;

// The result is not what we'd like to have
alert( str.match(regexp) ); // "She'

كما نرى ، وجد النمط علامة اقتباس افتتاحية مطابقة '' ، ثم يتم استهلاك النص حتى مطابقة ‘’ الاقتباس الآخر ، الذي يغلق المطابقة.

للتأكد من أن النمط يبحث عن علامة اقتباس الإغلاق تمامًا مثل علامة الاقتباس الافتتاحية ، يمكننا لفه في مجموعة التقاط وإعادة الرجوع إليه: (['"]) (. *؟) \ 1.

إليك الرمز الصحيح:

let str = `He said: "She's the one!".`;

let regexp = /(['"])(.*?)\1/g;

alert( str.match(regexp) ); // "She's the one!"

الآن يعمل! يعثر محرك التعبير العادي على “نمط” الاقتباس الأول: ([“”]) `ويحتفظ بمحتواه. هذه أول مجموعة التقاط.

علاوة على ذلك في النمط \ 1 يعني" البحث عن نفس النص الموجود في المجموعة الأولى "، وهو نفس الاقتباس بالضبط في حالتنا.

وبالمثل ، فإن \ 2 يعني محتويات المجموعة الثانية ، \ 3 – المجموعة الثالثة ، وما إلى ذلك.

ذكي إذا استخدمنا "؟:" في المجموعة ، فلا يمكننا الرجوع إليها. المجموعات التي تم استبعادها من التقاط `(؟: ...)` لا يحفظها المحرك.

لا تعبث: في النقشالنمط: \ 1 ، في الاستبدال: النقش: $ 1

في سلسلة الاستبدال ، نستخدم علامة الدولار: $ 1 ، بينما في النمط – ‘pattern backlash’: \ 1. ``

رجوع بالاسم: \ k <name>

إذا كان التعبير العادي يحتوي على العديد من الأقواس ، فمن المناسب إعطاءهم أسماء.

للإشارة إلى مجموعة مسماة، يمكننا استخدام \k<الاسم>.

في المثال أدناه ، المجموعة التي تحتوي على علامات اقتباس تسمى pattern :؟ <quote> ، لذا فإن المرجع الخلفي هو \ k <quote>:

let str = `He said: "She's the one!".`;

let regexp = /(?<quote>['"])(.*?)\k<quote>/g;

alert( str.match(regexp) ); // "She's the one!"
خريطة الدورة التعليمية