我正在尝试使用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
。为什么会这样,如何获得正确的输出?
答案 0 :(得分:2)
strtok
将第二个输入参数内的每个字符视为一个单独的定界符。
例如,调用时:
strtok("3_5_2_spd_20kmin_corrected_1_20190326.txt",'.txt')
Matlab将.
,t
,x
视为分隔符,因此会在遇到的第一个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'