この方法を試してください。
class TimeParser
{
Regex tripleReg = new Regex(@"([\d]{1,2}):([\d]{1,2}):([\d]{1,2})");
Regex doubleReg = new Regex(@"([\d]{1,2}):([\d]{1,2})");
public enum Format
{
HoursMinutesSeconds,
HoursMinutes,
MinutesSeconds
}
public TimeSpan Parse(string data)
{
if (tripleReg.IsMatch(data))
return Parse(data, Format.HoursMinutesSeconds);
else
{
var match = doubleReg.Match(data);
var segment = match.Groups[1];
var value = int.Parse(segment.Value);
if (value < 60)
return Parse(data, Format.MinutesSeconds);
else
return Parse(data, Format.HoursMinutes);
}
}
public TimeSpan Parse(string data, Format format)
{
TimeSpan result;
Match match;
var hours = 0;
var minutes = 0;
var seconds = 0;
switch (format)
{
case Format.HoursMinutesSeconds:
match = tripleReg.Match(data);
if (match.Success)
{
int.TryParse(match.Groups[1].Value, out hours);
int.TryParse(match.Groups[2].Value, out minutes);
int.TryParse(match.Groups[3].Value, out seconds);
}
break;
case Format.HoursMinutes:
match = doubleReg.Match(data);
if (match.Success)
{
int.TryParse(match.Groups[1].Value, out hours);
int.TryParse(match.Groups[2].Value, out minutes);
}
break;
case Format.MinutesSeconds:
match = doubleReg.Match(data);
if (match.Success)
{
int.TryParse(match.Groups[1].Value, out minutes);
int.TryParse(match.Groups[2].Value, out seconds);
}
break;
default:
break;
}
result = new TimeSpan(hours, minutes, seconds);
return result;
}
}
テスト:
static void Main(string[] args)
{
var parser = new TimeParser();
Console.WriteLine(parser.Parse("60:34").TotalSeconds); //218040 seconds, hh:mm
Console.WriteLine(parser.Parse("55:10").TotalSeconds); //3310 seconds, mm:ss
Console.WriteLine(parser.Parse("3:33:34").TotalSeconds); //12814 seconds, hh:mm:ss
Console.WriteLine(parser.Parse("12:34", TimeParser.Format.HoursMinutes).TotalSeconds); //45240 seconds
Console.WriteLine(parser.Parse("55:10", TimeParser.Format.MinutesSeconds).TotalSeconds); //3310 seconds
Console.WriteLine(parser.Parse("3:33:34", TimeParser.Format.HoursMinutesSeconds).TotalSeconds); //12814 seconds
Console.ReadKey();
}
hh:mmとmm:ssの違いは?これは私が素敵な一般的な例が信じられないほど難しいと思う主な理由です –
@CallumBradburyはい、追加のロジックを書くことなく識別するのは難しいです、それは私が尋ねたかったものです。長いコード行 –
'10:20'と入力したとします。 * 10時間20分* 10分20秒*ですか?あいまいさは、(一般的なケースでは)実装が不可能な作業になります。 –