2016-03-26 37 views
-1

私はC#プロジェクトで作業しています。いくつかの文字列からいくつかの日付を解析し抽出する必要があります。 私の文字列がTheeseです:文字列から日付を抽出するための正規表現

dalleは19.30デル・2016年2月4日alleの鉱石19.30デル・2016年2月6日
dalle鉱石19.30デル・2016年2月6日alleの鉱石19.30デル・2016年2月8日
鉱石...

私は2つの日付(例:04.02.2016 06.02.2016)を抽出し、2つの変数に保存したいと思います。次に、それらを解析して2つのDateTimeオブジェクトを作成します。私は最初の日付ではなく、秒1を抽出することができ、このコードで

public static string isdate(string input) 
{ 
    Regex rgx = new Regex(@"\d{2}.\d{2}.\d{4}"); 
    Match mat = rgx.Match(input); 
    if(mat.Success) 
    return mat.ToString(); 
    else return null; 
} 

: は、今私は、このコードを使用しています。正規表現を改善するにはどうすればよいですか? ありがとう!

 static void Main(string[] args) 
     { 
      string[] inputs = { 
       "dalle ore 19.30 del 04.02.2016 alle ore 19.30 del 06.02.2016", 
       "dalle ore 19.30 del 06.02.2016 alle ore 19.30 del 08.02.2016" 
          }; 

      string pattern = @"(?'hour'\d\d).(?'minute'\d\d)\sdel\s(?'day'\d\d.\d\d.\d\d\d\d)"; 

      foreach (string input in inputs) 
      { 
       MatchCollection matches = Regex.Matches(input, pattern); 
       foreach (Match match in matches) 
       { 
        TimeSpan time = new TimeSpan(int.Parse(match.Groups["hour"].Value), int.Parse(match.Groups["minute"].Value), 0); 
        DateTime date = DateTime.ParseExact(match.Groups["day"].Value, "MM.dd.yyyy", CultureInfo.InvariantCulture); 

        Console.WriteLine("Time : {0}", date.Add(time)); 
       } 
      } 
      Console.ReadLine(); 
     } 

[OK]を以下

てみコードがjdwendによって溶液は良いのですが、問題はHH.mmと日付の間、いくつかのスペースや文字にすることができることです。 HH:mm del dd.MM.YYYYですが、時にはこの形式になります。dd.MM.YYYY del       dd.MM.YYYY。あなたはまだ1つの正規表現ですべてのデータを解析することができると思いますか、それとも文字列をトークン化する必要がありますか?ありがとうございます!

+0

日付形式が**本当に**固定(DD.MM.YYYY)の場合は、 'Regex rgx = new Regex(@" \ d {1,2} \。\ d { 1,2} \。\ d {4} ");'( '\ .'をエスケープしなければならないことに注意してください。そうでなければ改行を除くすべてにマッチする' .'です。 ) –

+0

そのロケールに依存する場合は注意してください!正規表現はMM/DD/YYYY、YYYY-MM-DD、MM.DD.YYYYのようなものです。 – t0mm13b

+0

複数の一致を得るためにコードが必要なのですか?あなたの正規表現はすべての日付に一致します(https://regex101.com)。あなたは100%信頼できると確信しています。/r/qB6sT9/1)。 –

答えて

0

あなたの正規表現は問題ありませんが、は最初にに一致します。すべての一致を取得するには、代わりにMatchMatchesを使用します。

private static final Regex dateRegex = new Regex(@"\d{2}.\d{2}.\d{4}"); 

public static IEnumerable<string> ExtractDates(string input) 
{ 
    return from m in dateRegex.Matches(input).Cast<Match>() 
      select m.Value.ToString(); 
} 

注:正規表現オブジェクトはスレッドセーフで不変なので

  • 、あなたはそれを毎回再構築する必要はありません。静的変数に安全に格納することができます。

  • Matchesメソッドは、.NETジェネリックを先行しているので、我々はLINQを使用できるように、我々は、IEnumerable<Match>に結果のコレクションをキャストするCast<Match>呼び出す必要があります。

関連する問題