سؤال

منذ أن بدأت كتابة هذا السؤال، أعتقد أنني عرفت إجابات كل سؤال كان لدي، لكنني اعتقدت أنني سأقوم بالنشر على أي حال، لأنه قد يكون مفيدًا للآخرين وقد يكون المزيد من التوضيح مفيدًا.

كنت أحاول استخدام تعبير عادي مع lookahead مع تقسيم وظيفة جافا سكريبت.لسبب ما لم يتم تقسيم السلسلة على الرغم من أنها وجدت تطابقًا عندما اتصلت بالمطابقة.اعتقدت في الأصل أن المشكلة كانت من استخدام lookahead في تعبيري العادي.هنا مثال مبسط:

لا يعمل:

"aaaaBaaaa".split("(?=B).");

يعمل:

"aaaaBaaaa".match("(?=B).");

يبدو أن المشكلة تكمن في أنه في المثال المقسم، لم يتم تفسير السلسلة التي تم تمريرها على أنها تعبير عادي.يبدو أن استخدام الخطوط المائلة للأمام بدلاً من علامات الاقتباس يحل المشكلة.

"aaaaBaaaa".split(/(?=B)./);

لقد أكدت نظريتي بالمثال السخيف التالي:

"aaaaaaaa(?=B).aaaaaaa".split("(?=B).");

هل يعتقد أي شخص آخر أنه من الغريب أن تفترض وظيفة المطابقة أن لديك تعبيرًا عاديًا بينما لا تفعل وظيفة الانقسام ذلك؟

هل كانت مفيدة؟

المحلول

String.split يقبل إما سلسلة أو تعبيرًا عاديًا كمعلمة أولى.ال String.match الطريقة تقبل فقط التعبير العادي.

كنت أتخيل ذلك String.match سوف نحاول ونعمل مع كل ما تم تمريره؛لذا، إذا قمت بتمرير سلسلة، فسيتم تفسيرها على أنها تعبير عادي.ال String.split الطريقة لا تتمتع برفاهية القيام بذلك لأنها يمكن أن تقبل التعبيرات العادية والسلاسل؛وفي هذه الحالة سيكون من الحماقة أن نخمن.


يحرر:(من:"جافا سكريبت:الدليل القاطع")

String.match يتطلب تعبيرًا عاديًا للعمل معه.يجب أن تكون الوسيطة التي تم تمريرها أ RegExp الكائن الذي يحدد النمط المراد مطابقته.إذا لم تكن هذه الحجة أ RegExp, ، يتم تحويله أولاً إلى واحد عن طريق تمريره إلى ملف RegExp() البناء.

نصائح أخرى

إذا لم تخني (وأنا يمكن أن تكون خاطئة جدا هنا)، تم تنفيذ أسلوب انقسام في جافا سكريبت قبل كان المحرك باستخدام التعابير المنطقية في استخدام واسع، لذلك فمن المفترض من أجل التوافق مع الإصدارات السابقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top