所以我在Matlab中阅读多个文本文件,这些文件在第一列中有一列"次"。这些时间的格式为&#;; MM:SS.milliseconds' (对不起,如果这不是表达它的正确方法),例如字符串 29:59.9'将是(29 * 60)+(59)+(。9)= 1799.9秒,或者是直接秒。毫秒,其中 29.9'意味着29.9秒。单个文件的格式相同,但在不同文件中有所不同。由于我希望时间是第二种格式,我想检查字符串的格式是否与第一种格式匹配。如果它不匹配,则转换它,否则,继续。下面的代码是我要转换的代码,所以我的问题是如何检查字符串的格式?换句话说,我需要if语句的一些条件来检查格式是否错误。
%% Modify the textdata to convert time to seconds
timearray = textdata(2:end, 1);
if (timearray(1, 1) %{has format 'MM.SS.millisecond}%)
datev = datevec(timearray);
newtime = (datev(:, 5)*60) + (datev(:, 6));
elseif(timearray(1, 1) %{has format 'SS.millisecond}%)
newtime = timearray;
答案 0 :(得分:3)
您可以使用regular expressions来帮助您。正则表达式是指定如何搜索字符串中的特定模式的方法。因此,您希望查找字符串是否遵循以下格式:
xx:xx.x
或:
xx.x
每个的正则表达式语法定义如下:
^[0-9]+:[0-9]+\.[0-9]+
^[0-9]+\.[0-9]+
让我们逐步介绍每种方法的工作原理。
对于第一个,^[0-9]+
表示该字符串开始包含任意数字(^[0-9]
),+
表示该字符串应该至少一个数字。因此,1,2,... 10,... 20,......等是这个开头的有效语法。在数字之后应该用:
分隔,然后是另一个至少一个或多个的数字序列。之后,有一个.
将它们分开,然后是另一个数字序列。请注意我是如何使用\.
指定.
字符的。单独使用.
表示该字符是通配符。这显然不是您想要的,因此如果您想指定实际的.
字符,则需要在\
前加.
。
对于第二个,它与第一个几乎相同。但是,没有:
分隔符,我们只能使用.
。
要调用正则表达式,请在MATLAB中使用regexp
命令。它使用:
ind = regexp(str, expression);
str
表示您要检查的字符串,表达式是我们上面讨论过的正则表达式。您需要确保使用单引号封装表达式。正则表达式以字符串形式表示。 ind
会返回找到匹配项的字符串的起始索引。因此,当我们搜索特定格式时,ind
应该 1 ,表示我们在字符串的开头找到了,或者它返回为空([]
),如果找不到匹配项。这是一个可以重现的例子:
B = {'29:59.9', '29.9', '45:56.8', '24.5'};
for k = 1 : numel(B)
if (regexp(B{k}, '^[0-9]+:[0-9]+\.[0-9]+') == 1)
disp('I''m the first case!');
elseif (regexp(B{k}, '^[0-9]+\.[0-9]+') == 1)
disp('I''m the second case!');
end
end
因此,如果代码遵循第一种情况的格式,则代码应打印出I'm the first case!
,如果它遵循第二种情况的格式,则应打印I'm the second case!
。因此,通过运行此代码,我们得到:
I'm the first case!
I'm the second case!
I'm the first case!
I'm the second case!
在不知道你的字符串是如何格式化的情况下,我无法为你做其余部分,但这对你来说应该是一个好的开始。