2017-02-16 2 views
1

Пример строки:Java - эффективное регулярное выражение, чтобы соответствовать дате и времени

00000018.000f1b1f 0101559e Чт Май 19 2016 00:24:14 -05: 00 [к ....

. .. упоминает нежелательные слова.

Нет такой спецификации, как Thu всегда будет третьей строкой, если мы разделим пробел. Это может быть где угодно в строке. Я хочу найти Thu May 19 2016 00:24:14 -05:00 и разобраться с классом simpedateformat.

Я имею в виду некоторые регулярные выражения, как .*?((sun|mon|tue|wed|thu|fri|sat)\s* (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\s+\d{0,2}\s+\d{0,4}\s+\d{0,2}\:\d{0,2}\:\d{0,2}\s+([+|-]\d{0,2}:\d{0,2})?).*?

Я не очень хорошо регулярное выражение. Помогите мне улучшить мое регулярное выражение, которое может быть легко проанализировано классом simpledateformat. -05:00 не является обязательным.

Любые предложения?

+0

Ваше выражение выглядит хорошо для меня, если вы используете флагов, нечувствительный к регистру. Просто '[+ | -]' должен быть заменен на '[+ -]'. Не нужно бежать ':'. И если вы используете 'matcher.find', не нужно использовать'. *? 'В начале и конце. –

+0

@ WiktorStribiżew Да, конечно. Я буду использовать 'matcher.find'. Я избегу и включу флагом, нечувствительным к регистру. Благодарю. –

ответ

1

Ваше регулярное выражение выглядит хорошо, но вы можете повысить производительность за счет ограничения поиска в отдельных пространств и фиксированное количество цифр

(?i)\b((sun|mon|tue|wed|thu|fri|sat) (jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec) \d{1,2} \d{4} \d{2}\:\d{2}\:\d{2}([+|-]\d{2}:\d{2})?)

Тогда вы можете осуществлять поиск по нему в цикле (while (matcher.find()) ...)

Имейте в виду, что формат даты зависит от локали приложения. Ожидание определенного формата сделает ваше приложение хрупким.

+0

Спасибо за исправление фиксированной длины. –

1

Если вы не хотите использовать регулярные выражения, то вы можете рассчитывать на самом деле SimpleDateFormat проигнорирует материал после матча, так что ниже будет работать

String in = "00000018.000f1b1f 0101559e 2016/12/14 12:34 [k...."; 

    SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm"); 

    while (in.length() > 0) 
    try { 
     System.out.println(df.parse(in)); 
     break; 
    } 
    catch (Exception ee) { 
     in = in.substring(1); 
    } 

Примечание

Of курс измените указанную маску на то, что требуется

+0

Это именно то, что делает код. Обратите внимание на 'break' –

+0

Мне нужно с регулярным выражением. Он делает то, что ожидается. Спасибо –

+0

Опираясь на исключения во время нормальной обработки, это плохая практика. В прошлом бросание исключения было очень дорогостоящей операцией. В настоящее время она улучшается, но не до такой степени, что она незначительна. – rustyx

0

Нужно ли поддерживать все 3 формата даты? i.e:

dd.mm.yyyy - European (day-of-month, month, year) 
mm/dd/yyyy - US (month, day-of-month, year) 
yyyy-mm-dd - Scandinevian (year, month, day-of-month)