2017-12-07 13 views
0

C#でのTimeSpanに文字列「26h44m3s」を解析します。私はそれを処理することができます.NETで実装されているものを見つけることができません。だから私はそれをどのようにして、そしてクリーンな方法で達成するのですか?そしてこれに既存のナゲットはありますか?私はC#でのTimeSpanに文字列「26h44m3s」を解析する必要が

私は単収縮APIエンドポイントGetVideosの「期間」プロパティから文字列を受け付けております。

+3

'Regex.Match( "26h44m32s"、@"( \ D \ d)の時間( \ D \ D)M( \ D \ dは?) ")おそらく? –

+1

'TimeSpan.ParseExact'を使ってみましたか?あなたはそれが動作するためにバックスラッシュで「H」、「M」、および「s」を区切る必要があります。 – juharr

+0

@juharr:私はそれを試みました。 26は数時間の範囲外です。 –

答えて

4

あなたが任意の外部依存せずに正規表現の構文解析を使用してこれを行うことができます。

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); 
} 

使用法:

 var d = ParseTwitchTime("100h"); 
     d = ParseTwitchTime("23m1000s"); 
     d = ParseTwitchTime("12345h678s"); 

PS:rightToLeftのオプションは、単に正規表現パフォーマンスのために使用され、(それが後戻りする出力結果に影響を与えませんそれなしで済ませれば多くのこと)。

+0

まあまあ!識別子はオプションであるということを忘れてしまったので、ちょっとした変更が必要です。これらも返されており、解析する必要があります。 "26h8m" "26h" "15s" "56m47s" – Lindeberg

+0

問題はありません。私は答えを訂正するまで数秒待ってください。 – eocron

2

あなたはDurationとして解析し、このためNoda Timeを使用することができます。あなたははその後TimeSpanにそれを変換することができ - またはあなたがどこでも野田時間を使用し、よりよい経験を:)持つことができ

サンプルコード:

あなたが一致する必要がある複数のパターンを持っている場合は
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); 
     } 
    } 
} 
関連する問題