مطابقة أجزاء رقم الإصدار مع التعبيرات العادية

StackOverflow https://stackoverflow.com/questions/400522

  •  03-07-2019
  •  | 
  •  

سؤال

أحاول مطابقة أجزاء رقم الإصدار (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*)?

وأنا ببساطة إضافة بعض "صفر أو واحد" محددو الكمية إلى مجموعة التقاط وأيضا إلى نقاط فقط في حالة أنهم ليسوا هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top