質問
私はしたいと思います 検証 そして 抽出する の 文字列からの時間と分 .NET で正規表現を使用する。で区切られた (または区切られていない) 2 つの数値を回復するためだけに :
. 。受け入れられる形式h:m
または m
. 。受け入れられない :m
, h:
.
編集:ここで注意すべきことは、 時間 23 まではオーバーフローする可能性があります... 32.
時間(32以上)と分(59以上)のオーバーフローは、値の回復(int.Parse)の後に実行します。
* ただ楽しむために おそらく、時間の >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.
これが正規表現文字列です。「時間」および「分」という名前のキャプチャ グループにアクセスできます。「ExplicitCapture」および「Singleline」フラグを使用します。
@"^((?<時間>[0-9]{1,2}):)?(?<分>[0-9]{1,2})$"
ここで正規表現をテストできます。 http://derekslager.com/blog/posts/2007/09/a-better-dotnet-正規表現-tester.ashx
前述したように、この形式のみが許可されていることを検証する必要がない限り、DateTime 解析呼び出しの方が適している可能性があります。
また、負の値や小数も許可されません。(ただし、必要に応じて正規表現を変更してそれらを含めることができます)。