Динамическое регулярное выражение для форматов даты и времени

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

Вопрос

Существует ли существующее решение для динамического создания регулярных выражений на основе заданного шаблона формата даты и времени?Поддерживаемый шаблон формата даты и времени не имеет значения (Joda DateTimeFormat, java.text.SimpleDateTimeFormat или другие).

то естьдля данного формата даты и времени (например, «дд/ММ/гггг чч:мм») будет сгенерировано соответствующее регулярное выражение, соответствующее дате и времени в указанных форматах.

Это было полезно?

Решение

Я предполагаю, что у вас есть ограниченный алфавит, из которого могут быть построены ваши форматы времени.Это значит, "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 ]

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