如何在不读取字符串的情况下检查输入字符串格式的正确性?

时间:2013-08-09 15:20:05

标签: matlab input error-handling

我正在编写一个脚本,它将两个格式为'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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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