يمكننا استخدام محتويات نمط التقاط المجموعات: (…) `ليس فقط في النتيجة أو في سلسلة الاستبدال ، ولكن أيضًا في النمط نفسه.
المرجع حسب الرقم: \ 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!"
التعليقات
<code>
، وللكثير من السطور استخدم<pre>
، ولأكثر من 10 سطور استخدم (plnkr, JSBin, codepen…)