4

私は正規表現に慣れていないので、誰かが助けてくれるかどうか疑問に思っています。正規表現が私がやろうとしていることに最適なオプションであるかどうかさえわかりません。

調べている文字列の配列があります。さまざまな日付形式に一致する配列内のすべてのアイテムを検索したいと思います。これが私が一致させようとしているフォーマットの例です。

2012年4月1日-日に先行ゼロのない短い月の名前-一致

2012年4月1日-日の先行ゼロの短い月の名前-一致

2012年4月1日-日に先行ゼロのない全文月名-一致

2012年4月1日-日の先頭にゼロが付いたフルテキストの月の名前-一致

2012年4月1日-月と日の先行ゼロなし-一致

2012年4月1日-月と日の先行ゼロ-一致

2012年2月29日-年が飛躍の場合、2/29を許可-一致

2001/12/13-1-12以外の月-一致なし

2012年2月30日-1か月の日数が多すぎます-一致しません

2011年2月29日-うるう年でない場合-一致なし

私が開発した現在の正規表現。

\b(?:(?:Jan(?:uary)?|Feb(?:ruary)?|Mar(?:ch)?|Apr(?:il)?|May?|Jun(?:e)?|Jul(?:y) |Aug(?:ust)?|Sep(?:t(?:ember)?)?|Oct(?:ober)?|Nov(?:ember)?|Dec(?:ember)?))|(0?[1-9]|1[012])[- /.,](0?[1-9]|1[0-9]|2[0-9]|3[01])

これらの各フォーマットのさまざまな部分をデテックするために正規表現を開発することはできますが、それらをリンクすると、一致するものが1つだけになります。現在、2回一致しています(月、月+日)。全体が一致したときにのみ一致させたい。

ありがとう

jlimited

4

1 に答える 1

1

すべてを 1 つの単純な正規表現で実行したいのはなぜですか? それは本来あるべきよりも複雑に聞こえます。また、たとえば、将来的に新しいフォーマットを追加することを考えていますか? それは簡単ではありません。同様のパターンを 1 つの正規表現にグループ化します。たとえば、「2012 年 4 月 1 日」、「2012 年 4 月 1 日」を 1 つのグループにまとめ、次に「2012 年 4 月 1 日」、「2012 年 2 月 30 日」とします。とにかく、ある時点で、日付のさまざまなコンポーネントを共通の表現に処理する必要があると思います。そのためには、おそらく専用のコードが必要になります。

それはあなたが望む答えではないかもしれませんが、一般的な原則として、常に大きな問題を簡単に解決できる小さな問題に分割するようにしてください。

乾杯、

ホセ

于 2012-07-17T04:54:44.393 に答える