我想在 .NET 中使用 Regex从字符串中验证和提取小时和分钟。只是为了恢复两个数字,分开(或不分开):
。接受的格式
h:m
或m
. 不接受:m
,h:
。
编辑: 请注意,小时数可能会溢出 23 直到... 32。
小时(超过 32 小时)和分钟(超过 59 分钟)的溢出我将在值恢复后做(int.Parse)
*只是为了好玩,也许有一个相对简单的正则表达式可以过滤 >32 小时和 >59 分钟(可能是分钟[0-5]*[0-9]
,我不知道几个小时)?
你对正则表达式死心了吗?因为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-regular-expression-tester.ashx
如前所述,除非您需要验证是否只允许这种形式,否则 DateTime 解析调用可能会更好。
此外,不允许使用负值,也不允许使用小数。(但是,如果需要,可以更改正则表达式以包含它们)。
最后,验证(直到 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
感谢大家为这个答案做出贡献!