在Matlab中检查字符串的格式

时间:2014-07-14 16:14:11

标签: matlab

所以我在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; 

1 个答案:

答案 0 :(得分:3)

您可以使用regular expressions来帮助您。正则表达式是指定如何搜索字符串中的特定模式的方法。因此,您希望查找字符串是否遵循以下格式:

xx:xx.x

或:

xx.x

每个的正则表达式语法定义如下:

  1. ^[0-9]+:[0-9]+\.[0-9]+
  2. ^[0-9]+\.[0-9]+
  3. 让我们逐步介绍每种方法的工作原理。

    • 对于第一个,^[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!
    

    在不知道你的字符串是如何格式化的情况下,我无法为你做其余部分,但这对你来说应该是一个好的开始。