سؤال

وأود أن التحقق من صحة و مقتطف ال ساعات ودقائق من سلسلة باستخدام Regex في .NET. فقط لاستعادة الرقمين، مفصولة (أم لا) :. وبعد تنسيق مقبولh:m أو m. وبعد غير مقبول :m, h:.

تعديل:هذا هو ملاحظة ذلك، أن عدد ساعات يمكن أن تتجاوز 23 حتى ... 32.

الفائض لساعات (أكثر من 32) والدقائق (أكثر من 59) سأفعل بعد تقدير القيم (Int.parse)


* فقط للمتعة ربما هناك AA Regex النسبي بسيط يمكنه تصفية أيضا> 32 لمدة ساعة و> 59 لمدة دقيقة (ل الدقائق يمكن ان تكون [0-5]*[0-9], لساعات لا أعرف)؟

هل كانت مفيدة؟

المحلول 4

أخيرا، رمز التحقق من الصحة (حتى 32) وأيضا الحصول على القيم هو (إصدار vb.net):

Dim regexHour As New Regex( _ 
   "((?<hours>([012]?\d)|(3[01]))\:)?(?<minutes>[0-5]?\d)", _
    RegexOptions.ExplicitCapture)
Dim matches As MatchCollection = regexHour.Matches(value)

If matches.Count = 1 Then
  With matches(0)
    ' (!) The first group is always the expression itself. '
    If .Groups.Count = 3 Then ' hours : minutes '
      strHours = .Groups("hours").Value
      If String.IsNullOrEmpty(strHours) Then strHours = "0"
      strMinutes = .Groups("minutes").Value
    Else ' there are 1, 3 or > 3 groups '
      success = False
    End If
  End With
Else
  success = False
End If

شكرا للجميع المساهمة في هذه الإجابة!

نصائح أخرى

هل أنت ميت مجموعة على ريجيكس؟ لأن DateTime.Parse سيكون أكثر بساطة وأكثر قوة هنا.

 DateTime dt = DateTime.Parse("12:30 AM");

ثم يمنحك DT كل ما تحتاجه لمعرفته عن الوقت. DateTime.TryParse() قد يكون أفضل في حال كنت أقل معينة، إنها سلسلة زمنية.

(?:(\d\d?):)?([0-5][0-9])

إذا كنت ترغب في التحقق من صحة ساعات:

(?:([01]?[0-9]|2[0-3]):)?([0-5][0-9])

تعديل: اختبار وتصحيحها.


ومع ذلك، فإن أفضل طريقة للقيام بذلك مع DateTime.ParseExact, ، مثل هذا: (اختبار)

TimeSpan time = DateTime.ParseExact(
    input, 
    new string[] { "HH:mm", "H:mm", "mm", "%m" }, //The % is necessary to prevent it from being interpreted as a single-character standard format.
    CultureInfo.InvariantCulture, DateTimeStyles.None
).TimeOfDay;

للتحقق من الصحة، يمكنك استخدام tryparseexact.

إليك سلسلة Regex. يمكنك الوصول إلى مجموعات الالتقاط المسمى "ساعات" و "دقائق". استخدم الأعلام "Expliciccapture" و "Singleline".

@ "^ ((؟u003Chours> [0-9] {1،2}) :)؟ (؟u003Cminutes> [0-9] {1،2}) $ "

يمكنك اختبار Regexes هنا: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-Regular-expression-tester.ashx.

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

أيضا، لا يسمح بالقيم السلبية، ولا هي الكسور العشرية. (ولكن، يمكن تغيير Regex لتضمينها إذا لزم الأمر).

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