Вы можете использовать следующий набор регулярных выражений.Я рассматриваю двузначные годы следующим образом:
Если год больше сегодняшнего года минус 2000, предположим, что это 19xx
, в противном случае предположим 20xx
.Ожидайте проблем с этим после 2099; -)
Редактировать: Я использовал strings
в качестве переменной, но это тоже команда.Я изменил имя переменной на string_list
.
patterns = [ ...
'(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{4}) @? ?(?<hours>\d{2})(?<minutes>\d{2})|' ... % {m}m/{d}d/YYYY {@ }hhmm
'(?<month>\d{1,2})\.(?<day>\d{1,2})\.(?<year>\d{4}) @? ?(?<hours>\d{2})(?<minutes>\d{2})|' ... % {m}m.{d}d.YYYY {@ }hhmm
'(?<month>\d{1,2})/(?<day>\d{1,2})/(?<year>\d{2}) @? ?(?<hours>\d{2})(?<minutes>\d{2})|' ... % {m}m/{d}d/YY {@ }hhmm
'(?<month>\d{1,2})\.(?<day>\d{1,2})\.(?<year>\d{2}) @? ?(?<hours>\d{2})(?<minutes>\d{2})' ... % {m}m.{d}d.YY{@ }hhmm
];
string_list = [ ...
"Read back and verified on 1/15/13 1935 CM;"
"Was negative on 02.10.2015 @ 2015;"
"Result came back positive 4.2.2016 0821;"
"Some test for a year earlier than 2000 4.2.89 0821;"
];
matches = regexp(string_list, patterns,'names');
today = datetime('today');
currentyear = today.Year - 2000;
dates = cell(size(matches));
for i = 1:numel(matches)
year = str2double(matches{i}.year);
if year < 100
if year > currentyear
year = year + 1900;
else
year = year + 2000;
end
end
dates{i} = datetime(year, str2double(matches{i}.month), str2double(matches{i}.day), str2double(matches{i}.hours), str2double(matches{i}.minutes), 0);
end
Результат:
dates =
4×1 cell array
{[15-Jan-2013 19:35:00]}
{[10-Feb-2015 20:15:00]}
{[02-Apr-2016 08:21:00]}
{[02-Apr-1989 08:21:00]}
Возможно, петлю for
в конце можно упростить.