مطابقة أجزاء رقم الإصدار مع التعبيرات العادية
سؤال
أحاول مطابقة أجزاء رقم الإصدار (Major.Minor.Build.Revision) مع تعبيرات C# العادية.ومع ذلك، أنا جديد جدًا في كتابة Regex، وحتى استخدام Expresso أثبت أنه صعب بعض الشيء.الآن، لدي هذا:
(?<Major>\d*)\.(?<Minor>\d*)\.(?<Build>\d*)\.(?<Revision>\d*)
يعمل هذا، ولكنه يتطلب وجود كل جزء من رقم الإصدار.ما أود فعله هو أيضًا مطابقة الإصدارات مثل:
2.13
في هذه الحالة، تحتاج مجموعات البناء والمراجعة إلى إرجاع قيم فارغة.لا تتردد في اقتراح طريقة أفضل إذا كنت سأقوم بهذا بشكل خاطئ.
المحلول
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
ويجعل الجزأين الثالث والرابع اختياري.
نصائح أخرى
أعلم أن هذا ليس تعبيرًا عاديًا، ولكن System.Version يفعل كل العمل بالنسبة لك.
تم اختبار هذا النمط في VBScript:
^(\d+)(\.\d+)?(\.\d+)?(\.\d+)?$
سيتم التحقق من صحة كل ما يلي صحيح:
- 23
- 23.1
- 23.1.1
- 23.1.1.1
وما يلي كله كاذب:
- 23.11.11.33.11
- 23.43 2.1
- 44.11.2 3
- 3س.4.2.1
- 3.4.
- 4.3.21أ
إذا كنت لا تريد استخدام التعبيرات المنتظمة قد تتمكن من محاولة:
System.Diagnostics.FileVersionInfo fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(<string filePath>);
int major = fvi.FileMajorPart;
int minor = fvi.FileMinorPart;
int build = fvi.FileBuildPart;
وقبل الجواب لا يعمل بشكل صحيح
(?<Major>\d*)\.(?<Minor>\d*)(\.(?<Build>\d*)(\.(?<Revision>\d*))?)?
وهذه محاولة واحدة،
var regularExpression = @"^(\d+\.)?(\d+\.)?(\d+\.)?(\*|\d+)$";
var regex = Regex.IsMatch("1.0.0.0", regularExpression, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
Console.WriteLine(regex);
وحاول شيئا من هذا القبيل:
و(?<Major>\d*)\.?(?<Minor>\d*)?\.?(?<Build>\d*)?\.?(?<Revision>\d*)?
وأنا ببساطة إضافة بعض "صفر أو واحد" محددو الكمية إلى مجموعة التقاط وأيضا إلى نقاط فقط في حالة أنهم ليسوا هناك.