使用strtok提取字符串的特定部分

时间:2019-07-18 18:25:48

标签: matlab

我正在尝试使用strtok()提取字符串的一部分,但是我无法获得完整的输出。

输入:

string = '3_5_2_spd_20kmin_corrected_1_20190326.txt';

输出:

>> strtok(string)    
ans =    
    '3_5_2_spd_20kmin_corrected_1_20190326.txt'

>> strtok(string,'.txt')    
ans =    
    '3_5_2_spd_20kmin_correc'

>> strtok(string,'0326')    
ans =    
    '_5_'

>> strtok(string,'2019')    
ans =    
    '3_5_'

>> strtok(string,'.txt')    
ans =    
    '3_5_2_spd_20kmin_correc'

我希望输出为3_5_2_spd_20kmin_corrected_1_20190326,但实际输出为3_5_2_spd_20kmin_correc。为什么会这样,如何获得正确的输出?

3 个答案:

答案 0 :(得分:2)

strtok将第二个输入参数内的每个字符视为一个单独的定界符。

例如,调用时:
strtok("3_5_2_spd_20kmin_corrected_1_20190326.txt",'.txt')
Matlab将.tx视为分隔符,因此会在遇到的第一个t处拆分输入,并返回结果3_5_2_spd_20kmin_correc

在另一个使用'2019'的示例中,'2019'也不是单个分隔符,而是分隔符S,从某种意义上来说,使用的实际分隔符都是'2''0''1''9'。因此,字符串(从左到右)中遇到的第一个定界符是'2',紧接在'3_5_'之后。这就是为什么它返回'3_5_'的原因。

要获得预期的输出,我认为最好使用strsplit

result = strsplit(string,".txt");
result{1}

答案 1 :(得分:1)

extractBefore您要做什么:

>> string = '3_5_2_spd_20kmin_corrected_1_20190326.txt';
>> extractBefore(string,'.txt')

ans =

    '3_5_2_spd_20kmin_corrected_1_20190326'

答案 2 :(得分:1)

如果您的字符串是文件名/路径,并且您的目标是提取不带扩展名的文件名,则最好的选择是使用fileparts,如下所示:

>> str = '3_5_2_spd_20kmin_corrected_1_20190326.txt';
>> [~, name] = fileparts(str)

name =

    '3_5_2_spd_20kmin_corrected_1_20190326'