我想从时间戳ISO8601
格式中提取分钟和秒。我做了一些与regexp
的尝试,但我没有经验。用正则表达式分解ISO8601格式时间戳
你能帮我解决吗?
实例:
- PT1M46S - > 1分钟,46秒
- PT36S - >36秒
谢谢!
我想从时间戳ISO8601
格式中提取分钟和秒。我做了一些与regexp
的尝试,但我没有经验。用正则表达式分解ISO8601格式时间戳
你能帮我解决吗?
实例:
谢谢!
getPart = @(str, c) str2double(['0' regexp(str, ['\d*(?=' c ')'], 'match', 'once')]);
str = 'PT36S';
seconds = getPart(str, 'S');
minutes = getPart(str, 'M');
hours = getPart(str, 'H');
这会查找字符c
,找到它后面的数字并将它们转换为double。它在开头添加字符'0'
,因为如果regexp
找不到匹配项,它将返回一个空字符串。添加这个将空字符串转换为零而不影响其他数字。如果您想将其限制在PT
之后的部分,您可以使用原始字符串删除该部分
str = regexprep(str, '^.*PT', '');
使用datevec将代表小时,分钟等的字符串转换为相应的数值。请参阅“帮助datestr”以了解datevec第二次输入中使用的符号的规则,即。格式字符串。以下是如何转换给出的两个示例,我将它留给您来扩展它以涵盖整个格式。
str = 'PT36S';
str = strrep(str, 'PT', ''); % PT have to go.
if ~ismember('M', str)
% To use a single format string, we must write zero minutes if none are there already
str = ['00M', str];
end
% Date string cannot contain characters y,m,d,H,M or S, so remove these
str = strrep(str, 'S', ' ');
str = strrep(str, 'M', ' ');
% Call datevec with appropriate format string
[~, ~, ~, ~, min, sec] = datevec(str, 'MM SS')
您可以扩展这个来管理小时,日子等,通过包含额外的if循环类似于上面的循环。除了给出的例子,我对这个标准并不熟悉,所以让我知道它是否不那么简单。
感谢您的帮助! – Thoth 2014-10-08 20:21:27