0

「MM/DD/YYYY」のような形式の日付の正規表現を使用しています

"^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$"

正常に動作しています。問題ありません....ここで、 から までの年を制限したいのですが"1950""2050"これを行う方法、誰か助けてください....

4

2 に答える 2

6

したがって、答えは、タスクをどのように達成したいかによって異なります。

現在のRegex検索パターンは、20 世紀と 21 世紀の「MM/DD/YYYY」形式のほとんどの日付に一致します。そのため、この時点で文字列値として表される結果の一致をループし、各文字列をDateTime. 次に、いくつかの範囲検証チェックを行うことができます。

(注:私の例を機能させるために、オリジナルから最初^と最後を削除しました)$

string input = "This is one date 07/04/1776 and this is another 12/07/1941. Today is 08/10/2019.";
string pattern = "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d";

List<DateTime> list = new List<DateTime>();
foreach (Match match in Regex.Matches(input, pattern))
{
    Console.WriteLine(match.Value);
    DateTime result;
    if (DateTime.TryParse(match.Value, out result))
    {
        if (result.Year >= 1950 && result.Year <= 2050)
        {
            list.Add(result);
        }
    }
}

Console.WriteLine("Number of valid dates: {0}", list.Count);

このコードは次のように出力します。1776 は一致せず、他の 2 つの日付は一致しますが、最後の日付のみがリストに追加されます。

12/07/1941
08/10/2019
Number of valid dates: 1

このアプローチには、結果をもう一度ループして範囲検証を試行するなど、いくつかの欠点がありますが、いくつかの利点もあります。

  • フレームワークの組み込みメソッドは、許容範囲が時間の経過とともに変化する可能性があるため、検索パターンをDateTime常に調整するよりも扱いが簡単です。Regex
  • 後で範囲チェックを行うことで、Regex検索パターンを単純化してより包括的にすることもでき、おそらくすべての日付を取得することさえできます。
  • 単純なRegex検索パターンは保守が容易で、コードの意図も明確になります。Regex特に経験の浅いコーダーにとっては、混乱して意味を解読するのが難しい場合があります。
  • 複雑なRegex検索パターンは、微妙なバグを引き起こす可能性があります。コードに適切な単体テストがラップされていることを確認してください。

もちろん、他のアプローチは、Regex検索パターンを調整して、後で解析してチェックする必要がないようにすることです。ほとんどの場合、これが最適なオプションになります。検索パターンは範囲外の値を返さないため、その時点でループしたり追加のチェックを行ったりする必要はありません。これらの単体テストを覚えておいてください。

@skywalker が彼の回答で指摘したように、このパターンはうまくいくはずです。

string pattern = "(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19[5-9][0-9]|20[0-4][0-9]|2050)";
于 2012-04-26T12:09:05.463 に答える
2

1950 年から 2050 年までの両方を含む年は、19[5-9][0-9]|20[0-4][0-9]|2050 を使用して見つけることができます

于 2012-04-26T12:52:43.837 に答える