كتبت مقالًا عن البدء في التعبيرات العادية من قبل. اعتقدت أنني كنت على دراية نسبيًا بالتعبيرات العادية ، لكنني واجهت اليوم مأزقًا آخر. ربما كان ذلك لأنني لم أكن حذرا بما فيه الكفاية. سأركز اليوم على مشاركة التجميع في تعبيرات JavaScript العادية. إذا كنت لا تفهم تعبيرات JS العادية بما فيه الكفاية ، فيمكنك النقر هنا لمعرفة المزيد.
يستخدم التجميع على نطاق واسع في القواعد العادية. التجميع الذي أفهمه هو زوج من الأقواس () ، ويمثل كل زوج من الأقواس مجموعة.
يمكن تقسيم التجميع إلى:
سيحصل التقاط التجميع على نتائج التجميع المقابل في شكل مصطلح ثانٍ وفصل ثالث في وظيفة مثل Match Exec. لنلقي نظرة على مثال أولاً
var reg =/test (/d+)/؛ var str = 'new test001 test002' ؛ console.log (str.match (reg)) ؛ // ["test001" ، "001" ، الفهرس: 4 ، الإدخال: "اختبار جديد 001"]
في الكود (/d+) عبارة عن مجموعة (يطلق عليها بعض الأشخاص أيضًا نماذج فرعية) ، لكنهم يمثلون نفس المعنى. في المثال أعلاه ، Test001 هو نتيجة المطابقة الدقيقة.
ومع ذلك ، فإن مطابقة المجموعة هي العثور على أحرف تطابق النمط الفرعي/D+ من نتيجة المطابقة الدقيقة بالكامل (أي Test001). من الواضح هنا 001.
لكن هذا ما واجهته اليوم
var reg =/test (/d)+/؛ var str = 'new test001 test002' ؛ console.log (str.match (reg)) ؛ // ["test001" ، "1" ، index: 4 ، input: "new test001"]
الفرق هو أن (/d+) يتم تغييره إلى (/d)+، وأن نتيجة المطابقة بأكملها لا تزال Test001 ، ولكن نتيجة مطابقة المجموعة الأولى مختلفة.
دعونا نلقي نظرة على خلافاتهم
(/d+) هذا هو موقف التجميع ، لأنه بشكل افتراضي الأنماط المطابقة هي أنماط جشع ، أي قدر الإمكان
نتيجة كل مباريات /D+ هي 001. ثم يتم إضافة زوج من الأقواس في الخارج ، مما يعني مجموعة ، وبالتالي فإن نتيجة المطابقة في المجموعة الأولى هي 001.
دعونا نلقي نظرة على (/d)+ في المثال الثاني. هذا هو أيضا نمط الجشع. أولاً ، سوف يتطابق أولاً مع 0 ثم 0 وسيتطابق أيضًا مع نهاية 1.
يبدو أنه لا يوجد فرق عن المباراة في المثال الأول ، لكن التجميع (/d) هنا يعني مطابقة رقم واحد.
وفقًا لفهمي السابق ، كانت النتيجة أن المباراة كانت 0 في البداية كانت 0 ، لكن هذا الفهم خاطئ. نظرًا لأن المباراة بأكملها عبارة عن نمط جشع ، فطابقة قدر الإمكان
(/د) في المجموعة سوف تلتقط آخر نتيجة متطابقة 1
إذا كان نمطًا غير خضراء ، فسيتطابق مع أقل قدر ممكن
var reg =/test (/d)+؟/؛ var str = 'new test001 test002' ؛ console.log (str.match (reg)) ؛ // ["test001" ، "0" ، index: 4 ، input: "new test001"]
وبهذه الطريقة ، تكون النتيجة المطابقة (/D) هي 0.
التجميع غير المشترك
var reg =/test (؟:/d)+/؛ var str = 'new test001 test002' ؛ console.log (str.match (reg)) ؛ // ["test001" ، الفهرس: 4 ، المدخلات: "Test001 New Test002"]
يعني التجميع غير المشترك أن هناك حاجة إلى زوج من الأقواس في بعض الأماكن ، لكنهم لا يريدون أن يكون تجميع التقاط ، مما يعني أنه لا يريدون الحصول على هذه المجموعة من خلال وظائف مثل Macth Exec.
عادة ، إضافة؟: (؟: نمط) يصبح داخل القوس مجموعة غير ملتوية.
وبهذه الطريقة ، لن يكون هناك محتوى مطابق في نتيجة مطابقة المباراة ، مما يعني أن العنصر الثاني مفقود.
تركز هذه المقالة على شرح الفرق بين (/d+) و (/d)+، وهو أيضًا الحفرة التي صعدت إليها اليوم. إذا كانت هناك أي أخطاء ، فلا تتردد في تصحيحها.