日時形式の動的な正規表現
-
09-06-2019 - |
質問
指定された日時形式パターンから正規表現を動的に作成する既存のソリューションはありますか?サポートされている日付時刻形式パターンは関係ありません (Joda DateTimeFormat、java.text.SimpleDateTimeFormat など)。
つまり指定された日時形式 (たとえば、「dd/MM/yyyy hh:mm」) については、指定された形式内の日時と一致する対応する正規表現が生成されます。
解決
時刻形式を構成できるアルファベットは限られていると思います。つまり、 "HH"
24 時間制では常に「時間」になります。 "dd"
常に先頭にゼロが付く日など。
時間形式の連続的な性質のため、形式文字列をトークン化してみることもできます。 "dd/mm/yyyy HH:nn"
配列に入れる ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]
. 。次に、置換してその配列からパターン文字列を形成します。 "HH"
と "([01][0-9]|2[0-3])"
等々。これらのパターン アトムをルックアップ テーブル/配列に事前構築します。ルックアップ テーブルにない配列の部分はすべてリテラルです。正規表現ルールに従ってエスケープし、パターン文字列に追加します。
編集:正規表現ベースのソリューションの副作用として、ルックアップ テーブルのすべての正規表現の「アトム」を括弧で囲み、指定された形式文字列での順序を追跡すると、部分一致を使用して必要なコンポーネントを抽出できるようになります。一致から抽出して CreateDate 関数にフィードすることで、ParseDate 部分を完全にスキップします。
他のヒント
基本的な日付チェックをお探しの場合。このコードはこのデータと一致します。
\b(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}\b
10/07/2008
10.07.2008
1-01/2008
10/07/08
10.07.2008
1-01/08
regexbuddy 経由のコード
SimpleDateFormat
すでにこれを実行しています parse()
方法。
単一の文字列から複数の日付を解析する必要がある場合は、正規表現から始めて (一致が緩すぎる場合でも)、次を使用します。 parse()
正規表現によって見つかったすべての潜在的な一致に対して。
以下に示す js/jQuery コードは、日付時刻ではなく日付形式のみの正規表現を動的に生成します (開発バージョンはまだ完全にテストされていません。)
日付形式は「 D M Y 」にしてください。
例えば。
DD-MM-YY、
DD-MM-YYYY、
YYYY-MM-DD、
YYYY-DD-MM、
YYYY MM-DD、
YY年MM月日
DD/MM/YY、
DD/MM/YYYY、
YYYY/MM/DD、
YYYY/DD/MM、
YYYY/MM/DD、
YY/MM/DD
または、[ D M Y ] 文字で作成された他の形式
var dateFormat = "DD-MM-YYYY";
var order = [];
var position = {"D":dateFormat.search('D'),"M":dateFormat.search('M'),"Y":dateFormat.search('Y')};
var count = {"D":dateFormat.split("D").length - 1,"M":dateFormat.split("M").length - 1,"Y":dateFormat.split("Y").length - 1};
var seprator ='';
for(var i=0; i<dateFormat.length; i++){
if(["Y","M","D"].indexOf(dateFormat.charAt(i))<0){
seprator = dateFormat.charAt(i);
}else{
if(order.indexOf(dateFormat.charAt(i)) <0 ){
order.push(dateFormat.charAt(i));
}
}
}
var regEx = "^";
$(order).each(function(ok,ov){
regEx += '(\d{'+count[ov]+'})'+seprator;
});
regEx = regEx.substr(0,(regEx.length)-1);
regEx +="$";
var re = new RegExp(regEx);
console.log(re);
注 - 数ヶ月 /日の検証チェックはありません。月は 01 ~ 12 である必要があります。または日付は 01 ~ 31 である必要があります