التعبير العادي الديناميكي لتنسيقات التاريخ والوقت

StackOverflow https://stackoverflow.com/questions/52066

سؤال

هل يوجد حل موجود لإنشاء تعبيرات عادية ديناميكيًا خارج نمط تنسيق التاريخ والوقت المحدد؟لا يهم نمط تنسيق التاريخ والوقت المدعوم (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])" وما إلى ذلك وهلم جرا.قم بتكوين ذرات النمط هذه مسبقًا في جدول/مصفوفة بحث.جميع أجزاء المصفوفة غير الموجودة في جدول البحث هي أجزاء حرفية.قم بالهروب منها وفقًا لقواعد regex وألحقها بسلسلة النمط الخاصة بك.


يحرر:كأثر جانبي لحل يستند إلى التعبير العادي، عندما تضع جميع "ذرات" التعبير العادي لجدول البحث الخاص بك بين أقواس وتتبع ترتيبها في سلسلة تنسيق معينة، ستتمكن من استخدام المطابقات الفرعية لاستخراج المكونات المطلوبة من المباراة وإدخالها في وظيفة 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 "

على سبيل المثال.
يوم-شهر-سنة،
يوم-شهر-سنة،
السنة-الشهر-اليوم،
سنة-يوم-شهر،
ش-ي-ي-س س س س،
شهر-يوم-سنة،
يوم/شهر/سنة،
يوم/شهر/سنة،
سنة/شهر/يوم،
YYYY/DD/MM،
ش ش / د / يي،
مم/ي د/س س
أو تنسيقات أخرى ولكن تم إنشاؤها باستخدام حرف [ 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top