5

特定の日時形式パターンから動的に正規表現を作成する既存のソリューションはありますか? サポートされている日時形式のパターンは重要ではありません ( JodaDateTimeFormatなどjava.text.SimpleDateTimeFormat)。

具体的な例として、 のような特定の日時形式のdd/MM/yyyy hh:mm場合、指定された形式内の日時と一致するように、対応する正規表現を生成する必要があります。

4

4 に答える 4

3

時間形式を構成できるアルファベットは限られていると思います。つまり"HH"、24時間制では常に「時間」になり、"dd"先行ゼロのある日などになります。

時間フォーマットのシーケンシャルな性質のため、フォーマット文字列を"dd/mm/yyyy HH:nn"配列にトークン化することを試みることができます["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]。次に、に置き換え"HH""([01][0-9]|2[0-3])"、その配列からパターン文字列を形成します。これらのパターンアトムをルックアップテーブル/配列に事前構築します。ルックアップテーブルにない配列のすべての部分はリテラルです。正規表現の規則に従ってそれらをエスケープし、パターン文字列に追加します。


編集:正規表現ベースのソリューションの副作用として、ルックアップテーブルのすべての正規表現「アトム」をparensに入れ、指定されたフォーマット文字列でそれらの順序を追跡すると、サブマッチを使用して一致から必要なコンポーネントを作成してCreateDate関数にフィードし、ParseDate部分を完全にスキップします。

于 2008-10-08T08:49:16.447 に答える
1

基本的な日付チェックを探している場合、このコードはこのデータと一致します。

\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経由のコード

于 2008-10-07T15:28:41.290 に答える
0

SimpleDateFormatメソッドですでにこれを行っていparse()ます。

単一の文字列から複数の日付を解析する必要がある場合は、正規表現から始めて (一致が緩すぎる場合でも)、parse()正規表現によって見つかったすべての潜在的な一致に対して使用します。

于 2008-09-09T15:24:51.980 に答える
0

以下の js / jQuery コードは、動的に生成された RegEx を Date 形式専用であり、DateTime 用ではありません (開発バージョンはまだ完全にテストされていません)。

日付形式は「DMY」にする必要があります。

例えば

  • DD-MM-YY
  • DD-MM-YYYY
  • YYYY-MM-DD
  • YYYY-DD-MM
  • MM-DD-YYYY
  • MM-DD-YY
  • 日/月/年
  • DD/MM/YYYY
  • YYYY/MM/DD
  • YYYY/DD/MM
  • MM/DD/YYYY
  • 月/日/年

または、「 DMY」文字で作成された他の形式:

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 である必要があります。

于 2016-12-28T13:42:34.803 に答える