Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中将字符串“26h44m3s”解析为TimeSpan_C#_String_Parsing_Timespan - Fatal编程技术网

C# 在C中将字符串“26h44m3s”解析为TimeSpan

C# 在C中将字符串“26h44m3s”解析为TimeSpan,c#,string,parsing,timespan,C#,String,Parsing,Timespan,我需要在C中将字符串26h44m3s解析为TimeSpan。我在.NET中找不到任何可以处理它的实现。那么,我如何以干净的方式完成它呢?有没有任何现有的NUGET 我正在从Twitch API端点上的duration属性接收字符串。您可以使用正则表达式解析来完成此操作,而无需任何外部依赖项: public static TimeSpan ParseTwitchTime(string input) { var m = Regex.Match(input, @"^((?<hours&g

我需要在C中将字符串26h44m3s解析为TimeSpan。我在.NET中找不到任何可以处理它的实现。那么,我如何以干净的方式完成它呢?有没有任何现有的NUGET


我正在从Twitch API端点上的duration属性接收字符串。

您可以使用正则表达式解析来完成此操作,而无需任何外部依赖项:

public static TimeSpan ParseTwitchTime(string input)
{
    var m = Regex.Match(input, @"^((?<hours>\d+)h)?((?<minutes>\d+)m)?((?<seconds>\d+)s)?$", RegexOptions.ExplicitCapture | RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.RightToLeft);

    int hs = m.Groups["hours"].Success ? int.Parse(m.Groups["hours"].Value) : 0;
    int ms = m.Groups["minutes"].Success ? int.Parse(m.Groups["minutes"].Value) : 0;
    int ss = m.Groups["seconds"].Success ? int.Parse(m.Groups["seconds"].Value) : 0;

    return TimeSpan.FromSeconds(hs*60*60 + ms*60 + ss);
}

PS:RightToLeft选项仅用于正则表达式性能,不影响输出结果。如果不使用它,它会大量回溯。

您可以通过使用正则表达式解析来实现这一点,而无需任何外部依赖项:

public static TimeSpan ParseTwitchTime(string input)
{
    var m = Regex.Match(input, @"^((?<hours>\d+)h)?((?<minutes>\d+)m)?((?<seconds>\d+)s)?$", RegexOptions.ExplicitCapture | RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.RightToLeft);

    int hs = m.Groups["hours"].Success ? int.Parse(m.Groups["hours"].Value) : 0;
    int ms = m.Groups["minutes"].Success ? int.Parse(m.Groups["minutes"].Value) : 0;
    int ss = m.Groups["seconds"].Success ? int.Parse(m.Groups["seconds"].Value) : 0;

    return TimeSpan.FromSeconds(hs*60*60 + ms*60 + ss);
}
PS:RightToLeft选项仅用于正则表达式性能,不影响输出结果。如果不使用它,它会大量回溯。

您可以使用解析作为持续时间。然后,您可以将其转换为TimeSpan,或者您可以在任何地方使用Noda Time,并获得更好的体验:

示例代码:

using System;
using NodaTime;
using NodaTime.Text;

class Program
{
    static void Main()
    {
        string text = "26h44m3s";
        var pattern = DurationPattern.CreateWithInvariantCulture("H'h'm'm's's'");
        var duration = pattern.Parse(text).Value;
        Console.WriteLine(duration);
        var ts = duration.ToTimeSpan();
        Console.WriteLine(ts);
    }
}
如果您有多个需要匹配的模式,您可以创建一个复合模式——尽管您需要显式列出所有模式。下面是一个例子:

using System;
using System.Linq;
using NodaTime;
using NodaTime.Text;

class Program
{
    static void Main()
    {

        string[] formats =
        {
            "H'h'm'm's's'", "H'h'm'm'", "M'm's's'", "H'h'", "M'm'", "S's'"
        };
        var patterns = formats.Select(DurationPattern.CreateWithInvariantCulture);
        var builder = new CompositePatternBuilder<Duration>();
        foreach (var pattern in patterns)
        {            
            // The second parameter is used to choose which pattern is
            // used for formatting. Let's ignore it for now.
            builder.Add(pattern, _ => true);
        }
        var composite = builder.Build();


        string[] values = { "26h8m", "26h", "15s", "56m47s" };
        foreach (var value in values)
        {
            Console.WriteLine(composite.Parse(value).Value);
        }
    }
}
您可以使用解析作为持续时间。然后,您可以将其转换为TimeSpan,或者您可以在任何地方使用Noda Time,并获得更好的体验:

示例代码:

using System;
using NodaTime;
using NodaTime.Text;

class Program
{
    static void Main()
    {
        string text = "26h44m3s";
        var pattern = DurationPattern.CreateWithInvariantCulture("H'h'm'm's's'");
        var duration = pattern.Parse(text).Value;
        Console.WriteLine(duration);
        var ts = duration.ToTimeSpan();
        Console.WriteLine(ts);
    }
}
如果您有多个需要匹配的模式,您可以创建一个复合模式——尽管您需要显式列出所有模式。下面是一个例子:

using System;
using System.Linq;
using NodaTime;
using NodaTime.Text;

class Program
{
    static void Main()
    {

        string[] formats =
        {
            "H'h'm'm's's'", "H'h'm'm'", "M'm's's'", "H'h'", "M'm'", "S's'"
        };
        var patterns = formats.Select(DurationPattern.CreateWithInvariantCulture);
        var builder = new CompositePatternBuilder<Duration>();
        foreach (var pattern in patterns)
        {            
            // The second parameter is used to choose which pattern is
            // used for formatting. Let's ignore it for now.
            builder.Add(pattern, _ => true);
        }
        var composite = builder.Build();


        string[] values = { "26h8m", "26h", "15s", "56m47s" };
        foreach (var value in values)
        {
            Console.WriteLine(composite.Parse(value).Value);
        }
    }
}

Regex.Match26h44m32s,@?\d\d?h?\d\d?m?\d\d?s?您是否尝试过使用TimeSpan.ParseExact?你只需要用反斜杠来分隔h、m和s就行了。@juharr:我试过了;26在数小时内超出范围。您可以将其解析为Noda Time中的持续时间,然后如果您真的愿意,将其转换为TimeSpan,或者继续使用Noda Time:@JonSkeet噢,是的,解析的东西有点烦人,而不是Noda Time.Regex.Match26h44m32s,@?\d\d?h?\d\d?m?\d\d?s?你试过使用TimeSpan.ParseExact吗?你只需要用反斜杠来分隔h、m和s就行了。@juharr:我试过了;26在数小时内超出范围。你可以在野田佳彦时间内将其解析为一个持续时间,然后如果你真的愿意,将其转换为一个时间跨度,或者继续使用野田佳彦时间:@JonSkeet哦,是的,解析的东西有点烦人,而不是野田佳彦时间。哦,太好了!只是需要一些修改,因为我忘了提到标识符是可选的。它们也将被返回并必须被解析:26h8m 26h 15s 56M47S不是问题。等一下,直到我回答正确。哦,太好了!只是需要一些修改,因为我忘了提到标识符是可选的。它们也将被返回并必须被解析:26h8m 26h 15s 56M47S不是问题。请等一下,直到我答对为止。