0

我正在编写一个脚本,它将两个格式为“HH:MM”的字符串作为输入。这些字符串是以小时 (HH) 和分钟 (MM) 为单位的时间。如果用户输入错误的格式一段时间,我想显示一条错误消息,例如“HH:MM:SS”,如果他们认为脚本也可以解释秒。我将其设置为接受负数,因此将正确解释像“-HH:MM”这样的输入。像“HHH:MMM”这样具有可变小时和分钟大小的输入也可以,实际上应该接受任何形式为 %s:%s 的输入,因为稍后会处理像“5:30 AM”这样的错误。

我需要在阅读之前测试输入的格式是否为“字符串冒号字符串”,这可能吗?为了使问题更清楚,这里是解释我如何读取输入 time1 和 time2 的代码:

[hour1, min1] = strread(time1, '%s%s', 'delimiter', ':');
[hour2, min2] = strread(time2, '%s%s', 'delimiter', ':');

如果 time1 和 time2 的格式错误,strread 会抛出一个无用的错误。我想先显示我自己的错误来解释问题所在。在实际阅读之前如何检查 time1 和 time2 的格式?

想法:

formatSpec = '%s : %s';
input = textscan(time1,formatSpec);
%Compare input to formatSpec somehow to see if they match?
if (no_match)
error('time1 must be formatted as HH:MM');
end
4

2 回答 2

1

你可以尝试这样的事情:

time1 = '10:21';
if isempty(regexp(time1,'^\d{2}:\d{2}'))
    disp('the format is wrong') %won't display because the format if ok
end

并检查其他格式:

time1 = '100:21';
if isempty(regexp(time1,'^\d{2}:\d{2}'))
    disp('the format is wrong') %will display because the format is wrong
end

编辑

如果您想接受 'HHH:MMM' 和其他情况,请使用:

regexp(time1,'^\d+:\d+')

对于否定情况('-HHH:MMM' 或其他否定情况),请使用:

regexp(time1,'^-\d+:\d+')

第二次编辑

如果你只想在一行中测试它:

regexp(time1,'^(-|.){1}\d+:\d+$') % however this one doesn't support 'HH:MM AM'
regexp(time1,'^(-|.){1}\d+:\d+.+$') % Now support 'HH:MM AM'

我对其进行了测试,它会1为您提到的每个案例返回。

于 2013-08-09T15:41:39.247 回答
0

只要只有一个:符号,您就可以接受任何数字。换句话说,也许您想检测多于一个冒号的情况?您可以:在处理字符串之前先计算符号的数量并为这些情况生成错误吗?

于 2013-08-09T15:53:38.783 回答