Avatar ·

لماذا يعمل \d في C# بشكل أبطأ من [0-9]؟

مرحبًا بالجميع! أنا مطور C# مبتدئ واجهت مشكلة غير متوقعة عند تحسين التعبيرات المنتظمة. لدي مهمة: التحقق مما إذا كانت السلسلة تتكون من أرقام فقط. كتبت نسختين من التعبير المنتظم: 1. `^\d+$` 2. `^[0-9]+$` بديهيًا، يبدو أن `\d` يجب أن يكون أسرع أو على الأقل بنفس السرعة، لأنه مجرد اختصار للأرقام. لكنني أجريت اختبار أداء صغير باستخدام `Stopwatch` على سلسلة طولها 1000 حرف (1000 رقم عشوائي) وحصلت على نتائج صادمة: ``` \d: ~450 tick [0-9]: ~120 tick ``` الفرق يقارب 4 مرات! وقد قمت بتشغيل الاختبار 100 مرة لاستبعاد العشوائية. النتائج مستقرة. أستخدم .NET 6 و `Regex` القياسي بدون flags. لماذا يحدث هذا؟ فكل من `\d` و `[0-9]` يجب أن يمثلان نفس الشيء — الأرقام من 0 إلى 9. هل يمكن أن أكون أقيس شيئًا خاطئًا؟ أم أن هناك مشاكل خفية مع Unicode في C#؟ أرجو توضيح الأمر وكيفية كتابة التعبيرات المنتظمة بشكل صحيح للبحث عن الأرقام.