0

.NETの正規表現を使用して文字列から時間と分を検証して抽出したいと思います。で区切られた(またはされていない)2つの数値を回復するためだけに。受け入れられる形式 または。受け入れられない、。:h:mm:mh:

編集: これは、時間数が23から... 32までオーバーフローする可能性があることに注意してください。

時間(32以上)と分(59以上)のオーバーフロー値の回復(int.Parse)の後に実行します


*楽しみのために、32を超える時間と59を超える分をフィルタリングできる比較的単純な正規表現があるかもしれません(については[0-5]*[0-9]、分からない場合もあります)。

4

4 に答える 4

8

あなたは正規表現に完全に固執していますか?DateTime.Parseここでははるかに単純で強力になるからです。

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

次に、dtは、時間について知る必要があるすべてを提供します。DateTime.TryParse()それが時間文字列であるかどうか確信が持てない場合は、より良いかもしれません。

于 2010-01-04T18:07:27.723 に答える
2

(?:(\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を使用できます。

于 2010-01-04T18:05:55.337 に答える
1

これが正規表現の文字列です。名前付きキャプチャグループ「時間」および「分」にアクセスできます。フラグ「ExplicitCapture」と「Singleline」を使用します。

@ "^((?<時間> [0-9] {1,2}):)?(?<分> [0-9] {1,2})$"

ここで正規表現をテストできます:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

前述のように、このフォームのみが許可されていることを検証する必要がない限り、DateTime解析呼び出しの方が適している場合があります。

また、負の値は許可されておらず、小数も許可されていません。(ただし、必要に応じて、正規表現を変更してそれらを含めることができます)。

于 2010-01-04T18:11:29.417 に答える
0

最後に、検証 (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

この回答に貢献してくれた皆さんに感謝します!

于 2010-01-11T11:28:16.130 に答える