"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يؤدي \"test\".replaceAll(\".\"، \"a\") إلى \"aa\" في Java؟

لماذا يؤدي \"test\".replaceAll(\".\"، \"a\") إلى \"aa\" في Java؟

تم النشر بتاريخ 2024-11-10
تصفح:808

Why Does \

String ReplaceAll Anomaly: استبدال مزدوج بـ ".*"

في Java، تقوم طريقة String.replaceAll() بإجراء بحث عالمي و استبدال العملية على سلسلة معينة باستخدام تعبير عادي. ومع ذلك، ينشأ سلوك غير متوقع عند استخدام نمط التعبير العادي ".*"، مما يؤدي إلى مشكلة استبدال مزدوج.

يطرح السؤال سيناريو حيث يكون "test".replaceAll("."، "a ") ينتج "aa" كنتيجة. وذلك لأن . هو محدد كمي جشع يطابق أي عدد من الأحرف (بما في ذلك الصفر)، ويلتقط سلسلة الإدخال بأكملها في البداية. ونتيجة لذلك، يستبدل الاستبدال الأول السلسلة بأكملها بـ "a".

ومع ذلك، يمكن أن يتطابق . أيضًا مع سلسلة فارغة. بعد الاستبدال الأولي، تصبح السلسلة الفارغة المتبقية في نهاية الإدخال مؤهلة لتكون مطابقة لـ . أيضًا. ومن ثم، يحدث استبدال ثانٍ، حيث يتم استبدال السلسلة الفارغة بـ "a"، مما يؤدي إلى الإخراج النهائي "aa".

لمنع مشكلة الاستبدال المزدوج هذه، فكر في بدائل .* مثل . ، الأمر الذي يتطلب حرفًا واحدًا على الأقل لمطابقته. وبدلاً من ذلك، فإن استخدام ReplaceFirst()‎ لن يؤدي إلا إلى استبدال التكرار الأول، مما يتجنب الموقف الذي تتم فيه مطابقة سلسلة فارغة مرة ثانية.

ومن المثير للاهتمام، أن بعض محركات regex لا تظهر سلوك الاستبدال المزدوج هذا. على سبيل المثال، سيعتبر GNU sed أن المدخلات قد استنفدت بعد المطابقة الأولى، مما يمنع المزيد من الاستبدالات. ومع ذلك، من المهم أن تكون على دراية بهذا الشذوذ المحتمل عند استخدام ".*" مع طريقة String.replaceAll() في Java.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3