لماذا يعمل \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#؟
أرجو توضيح الأمر وكيفية كتابة التعبيرات المنتظمة بشكل صحيح للبحث عن الأرقام.