Динамическое регулярное выражение для форматов даты и времени - PullRequest
4 голосов
/ 09 сентября 2008

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

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

Ответы [ 4 ]

3 голосов
/ 08 октября 2008

Полагаю, у вас есть ограниченный алфавит, из которого можно построить ваши форматы времени. Это означает, что "HH" всегда будет «часами» на 24-часовых часах, "dd" всегда днем ​​с нулем в начале и т. Д.

Из-за последовательной природы формата времени вы можете попытаться разбить строку формата "dd/mm/yyyy HH:nn" на массив ["dd", "/", "mm", "/", "yyyy", " ", "HH", ":", "nn"]. Затем создайте шаблонную строку из этого массива, заменив "HH" на "([01][0-9]|2[0-3])" и так далее. Предварительно скомпонуйте эти атомы шаблона в справочную таблицу / массив. Все части вашего массива, которых нет в таблице поиска, являются литералами. Сбросьте их в соответствии с правилами регулярных выражений и добавьте их в строку шаблона.


РЕДАКТИРОВАТЬ: В качестве побочного эффекта для решения на основе регулярных выражений, когда вы помещаете все «атомы» регулярного выражения вашей таблицы поиска в парены и отслеживаете их порядок в заданной строке формата, вы можете использовать подстроки извлечь требуемые компоненты из соответствия и передать их в функцию CreateDate, пропуская, таким образом, часть ParseDate.

1 голос
/ 07 октября 2008

Если вы ищете базовую дату проверки. этот код соответствует этим данным.

\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

Код через регулярное выражение

0 голосов
/ 28 декабря 2016

Ниже приведен код js / jQuery для динамического регулярного выражения генерации только для формата даты, а не для даты и времени (версия разработки еще не полностью протестирована.)

Формат даты должен быть в "D M Y"

например.
ДД-ММ-ГГ,
ДД-ММ-ГГГГ,
ГГГГ-ММ-ДД,
ГГГГ-ДД-ММ,
ММ-ДД-ГГГГ,
ММ-ДД-ГГ,
ДД / ММ / ГГ,
ДД / ММ / ГГГГ,
ГГГГ / ММ / ДД,
ГГГГ / ДД / ММ,
ММ / ДД / ГГГГ,
MM / DD / YY
Или другие форматы, но созданные с [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

0 голосов
/ 09 сентября 2008

SimpleDateFormat уже делает это с помощью метода parse().

Если вам нужно проанализировать несколько дат из одной строки, начните с регулярного выражения (даже если оно слишком мягко) и используйте parse() для всех потенциальных совпадений, найденных регулярным выражением.

...