3

多くの場合、次のような形式の日付の「日」部分をキャプチャする必要があることに気付きました。"YYYY/DD/MM"私の質問は、キャプチャグループで正規表現を使用する方が、「/」でsplitを呼び出すよりも良いアイデアかどうかです。 「そして、配列の2番目の項目を取得するだけですか?

機能的には、両方とも同じ結果が得られることを認識しています。

メモリに関しては、どちらも内部で正規表現エンジンを使用していること、そしてほとんどの場合、splitを使用して日の値を読み取った後に配列を破棄していることを認識しています。Matchしかし、技術的には、オブジェクトから読み取った後もまったく同じことを行います。私は、そうではないと考えるべきコーナーケースとトレードオフがあるかどうかを確認しようとしていますか?(読みやすさのほかに...「分割」は明らかにそこで勝ちます...)

===編集===APIに関しては、愚かなレガシーの理由からGroovy1.5.0に制限されています。

edmastermindのソリューションを明確にするには:

def nowCal = Calendar.instance 
def currentDay = nowCal.get(Calendar.DAY_OF_MONTH)
4

6 に答える 6

2

常に同じ形式の場合は、Stringのsubstringメソッドを使用して、必要なものを引き出します。REGEXは、使用するたびに解析する必要があります。

于 2012-05-25T12:24:26.133 に答える
2

DateFormat、文字列の形式でsetDateFormatを使用してから、Dateオブジェクトを解析すると、コードはより意味のあるものになります。パフォーマンスに関しては、メソッドよりもオーバーヘッドが大きくなる可能性があります。

ただし、次の点を指摘しておき
ます。入力文字列を信頼できる場合は、結果を取得するために必要なものを何でも使用できます。
できない場合は、DateFormatを使用して日付文字列を解析します。

于 2012-05-25T12:24:29.143 に答える
2

Groovy では、次のことができます。

def date = '2012/05/25'

assert 25 == Date.parse( 'yyyy/MM/dd', date )[ Calendar.DAY_OF_MONTH ]

Groovy 1.5.0 の場合、これは次のようになります (関数としてラップされます)。

int getDay( String date, String format='yyyy/MM/dd' ) {
  Calendar.instance.with {
    time = new java.text.SimpleDateFormat( format ).parse( date )
    get( Calendar.DAY_OF_MONTH )
  }
}

def date = '2012/05/25'
assert 25 == getDay( date )
于 2012-05-25T13:10:05.717 に答える
1

この場合、最も読みやすく保守しやすいコードを生成するソリューションを選択する必要があるため.split、正規表現アプローチではなくアプローチを選択します。

数か月後に、日付の形式が変更されることを考慮してください。これは、正規表現にわずかな変更を加える必要があることを意味します。これは困難な作業ではないかもしれませんが、正規表現への露出が限られている人にとってはそれほど簡単ではないかもしれません。

この場合、.split("//")この場合は非常に直感的であるため、正規表現の経験がない人でも理解しやすく、維持しやすくなります。

于 2012-05-25T12:24:52.950 に答える
1

最小限のリソースでそれを行う必要がある場合は、String#indexOfおよびString#substringの使用を検討してください。ベンチマークを実行すると、正しい決定を下すのに役立つことに注意することも重要です。

正規表現を使用することは、この問題に関して非常に簡潔であり、中間部分にのみ関心があることを伝えていると思います。分割されたバージョンは、でエンコードしない限り、分割された要素の数がわからないため、読みにくくなります。コメント。

単純な正規表現アプローチも分割アプローチも、適切な日付検証を提供しません。そのためには、DateFormatの解析関数の使用を検討してください。これはおそらくすべての中で最も遅いでしょう。

于 2012-05-25T12:26:26.057 に答える
1

Java タグに注目して、 DAY_OF_MONTHを呼び出して、正規表現または分割する代わりに「日」の部分を取得することは実行可能ではないでしょうか?

于 2012-05-25T16:07:34.800 に答える