Динамическое регулярное выражение для форматов даты и времени
-
09-06-2019 - |
Вопрос
Существует ли существующее решение для динамического создания регулярных выражений на основе заданного шаблона формата даты и времени?Поддерживаемый шаблон формата даты и времени не имеет значения (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.