0

「HH:MM」形式の 2 つの文字列を入力として受け取るスクリプトを作成しています。これらの文字列は、時間 (HH) と分 (MM) の時間です。スクリプトが秒も解釈できると思われる場合、ユーザーが「HH:MM:SS」などの間違った形式の時刻を入力した場合に、エラー メッセージを表示したいと考えています。負の時間を受け入れるように設定したので、「-HH:MM」のような入力は正しく解釈されます。'HHH:MMM' のような時間と分のサイズが可変の入力も問題ありません。'5:30 AM' のようなエラーは後で処理されるため、実際には %s:%s の形式の入力はすべて受け入れられる必要があります。

必要なのは、読み取る前に入力が「文字列コロン文字列」の形式であることをテストすることです。これは可能ですか? 問題をより明確にするために、入力 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+')

2回目の編集

そして、1行だけでテストしたい場合:

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

符号が 1 つしかない限り、任意の数字を受け入れるようです:。言い換えれば、複数のコロンのケースを検出したかったのではないでしょうか? 文字列を処理する前に、まず記号の数を数え:て、それらのケースのエラーを生成できますか?

于 2013-08-09T15:53:38.783 に答える