持续时间(HH:MM)和分割的正则表达式?(或者内置在c# Splitter中)



我正在尝试根据以下格式解析字符串:HH:MM

12:23 //Normal
2:24 //No trailing 0
01:00 //With trailing 0
00:21 //00 First number
0:32 //0 First Number
10:4 //No 0 second number, denotes 10:04

第一个号码最大24,最小0。

第二个数字最大59,最小0.

我使字符串regex字符串d+:d+。但这仍然匹配范围之外的数字。处理这些数字的最好方法是什么?

我在c#中以字符串的形式进行验证,如果有更好的方法来验证这种格式(并将其分成小时和分钟,请告诉我!)

基本上,我接受输入HH:MM,验证它,分割它,然后将其转换为分钟的int

的例子:

  1. 用户输入10:20
  2. 检查格式验证HH:MM
  3. 检查范围验证(0-24):(0-60)
  4. 拆分为变量int hrs = 10int mins = 20
  5. return (mins + (hrs*60));

您可以使用TimeSpan.TryParse。这样做的额外好处是可以通过TotalMinutes属性为您计算分钟:

List<string> tests = new List<string>()
{
    "12:23", //Normal
    "2:24", //No trailing 0
    "01:00", //With trailing 0
    "00:21", //00 First number
    "0:32", //0 First Number
    "10:4", //No trailing 0 second number
};
foreach (var test in tests)
{
    TimeSpan t;
    if (TimeSpan.TryParse(test, out t))
        Console.WriteLine(t.TotalMinutes);
    else
        Console.WriteLine("Not valid");
}
输出:

743
144年
60
21日
32
604

@AlexK在注释中正确地指出,这将匹配包含秒的字符串,如11:22:33。为了防止这种情况,您可以使用TryParseExact并传递一个可接受的格式数组:

List<string> tests = new List<string>()
{
    "12:23", //Normal
    "2:24", //No trailing 0
    "01:00", //With trailing 0
    "00:21", //00 First number
    "0:32", //0 First Number
    "10:4", //No trailing 0 second number
    "11:22:33", //Error
};
foreach (var test in tests)
{
    TimeSpan t;
    //if (TimeSpan.TryParse(test, out t))
    if (TimeSpan.TryParseExact(test, new[] { "h\:m", "hh\:m", "hh\:m", "h\:mm", "hh\:mm" }, CultureInfo.CurrentCulture, out t))
        Console.WriteLine(t.TotalMinutes);
    else
        Console.WriteLine("Failed");
}

输出

743
144年
60
21日
32
604年
失败的

相关内容

最新更新