لن يتم تقسيم Javascript باستخدام regex
-
03-07-2019 - |
سؤال
منذ أن بدأت كتابة هذا السؤال، أعتقد أنني عرفت إجابات كل سؤال كان لدي، لكنني اعتقدت أنني سأقوم بالنشر على أي حال، لأنه قد يكون مفيدًا للآخرين وقد يكون المزيد من التوضيح مفيدًا.
كنت أحاول استخدام تعبير عادي مع 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()
البناء.
نصائح أخرى
إذا لم تخني (وأنا يمكن أن تكون خاطئة جدا هنا)، تم تنفيذ أسلوب انقسام في جافا سكريبت قبل كان المحرك باستخدام التعابير المنطقية في استخدام واسع، لذلك فمن المفترض من أجل التوافق مع الإصدارات السابقة.