MATLAB 从字符串中读取所有数字
MATLAB reading all numbers from a string
我正在尝试从字符串中读取未知数量的数值。
例如:
line = 'bla bal bli : 3 5 12 15 266'
我尝试了 sscanf
但它需要我提前知道字符串中有多少个数字。
您可以简单地使用 isstrprop
。
line = 'bla bal bli : 3 5 12 15 266'
line(isstrprop(line, 'digit'))
您从字符串中提取数字:
line =
bla bal bli : 3 5 12 15 266
ans =
351215266
如果要从字符串中提取整数,可以使用正则表达式:
获取数字作为字符串元胞数组:
>> line = 'bla bal bli : 3 5 12 15 266';
>> regexp(line,'(?<!\d)(\d)+(?!\d)','match')
ans =
'3' '5' '12' '15' '266'
获取数字作为数值向量:
>> str2double(regexp(line,'(?<!\d)(\d)+(?!\d)','match'))
ans =
3 5 12 15 266
如果您的字符串在字母和数字之间总是有一个分隔符,例如冒号 (':'
),您可以使用 strsplit
来提取字符串中仅包含数字的部分,这将比使用正则表达式更快:
line = 'bla bal bli : 3 5 12 15 266';
numstr = strsplit(line,':');
然后您可以使用 sscanf
将数字提取为双精度数组:
nums = sscanf(numstr{2},'%u') % Assuming digits are always unsigned, if not use %d
如果您使用的是 R2012b 或更早版本,则不会 strsplit
。请参阅 this answer 了解替代方案。
以防万一可能出现负数或小数,正则表达式可以这样更新:
str2double(regexp(line,'(-?\d+\.?\d?)','match'))
示例:
str2double(regexp('bla bal bli : 3 5 12 15 266','(-?\d+\.?\d?)','match'))
ans =
3 5 12 15 266
str2double(regexp('bla bal bli : 3 5 12 15.4 -266','(-?\d+\.?\d?)','match'))
ans =
3.0000 5.0000 12.0000 15.4000 -266.0000
从 16b 开始,您可以使用字符串 class
line = "bla bal bli : 3 5 12 15 266";
numbers = extractAfter(line,': ');
numbers = split(numbers);
numbers = double(numbers);
这似乎是最快的选择。
>> profFunc
Elapsed time is 0.088259 seconds.
Elapsed time is 1.558718 seconds.
Elapsed time is 1.482743 seconds.
function profFunc
n = 1E4;
tic;
for i = 1:n
line = "bla bal bli : 3 5 12 15 266";
numbers = extractAfter(line,': ');
numbers = split(numbers);
numbers = double(numbers);
end
toc
tic;
for i = 1:n
line = 'bla bal bli : 3 5 12 15 266';
numbers = str2double(regexp(line,'(?<!\d)(\d)+(?!\d)','match'));
end
toc
tic;
for i = 1:n
line = 'bla bal bli : 3 5 12 15 266';
numstr = strsplit(line,':');
nums = sscanf(numstr{2},'%u');
end
toc
end
我正在尝试从字符串中读取未知数量的数值。
例如:
line = 'bla bal bli : 3 5 12 15 266'
我尝试了 sscanf
但它需要我提前知道字符串中有多少个数字。
您可以简单地使用 isstrprop
。
line = 'bla bal bli : 3 5 12 15 266'
line(isstrprop(line, 'digit'))
您从字符串中提取数字:
line =
bla bal bli : 3 5 12 15 266
ans =
351215266
如果要从字符串中提取整数,可以使用正则表达式:
获取数字作为字符串元胞数组:
>> line = 'bla bal bli : 3 5 12 15 266'; >> regexp(line,'(?<!\d)(\d)+(?!\d)','match') ans = '3' '5' '12' '15' '266'
获取数字作为数值向量:
>> str2double(regexp(line,'(?<!\d)(\d)+(?!\d)','match')) ans = 3 5 12 15 266
如果您的字符串在字母和数字之间总是有一个分隔符,例如冒号 (':'
),您可以使用 strsplit
来提取字符串中仅包含数字的部分,这将比使用正则表达式更快:
line = 'bla bal bli : 3 5 12 15 266';
numstr = strsplit(line,':');
然后您可以使用 sscanf
将数字提取为双精度数组:
nums = sscanf(numstr{2},'%u') % Assuming digits are always unsigned, if not use %d
如果您使用的是 R2012b 或更早版本,则不会 strsplit
。请参阅 this answer 了解替代方案。
以防万一可能出现负数或小数,正则表达式可以这样更新:
str2double(regexp(line,'(-?\d+\.?\d?)','match'))
示例:
str2double(regexp('bla bal bli : 3 5 12 15 266','(-?\d+\.?\d?)','match'))
ans =
3 5 12 15 266
str2double(regexp('bla bal bli : 3 5 12 15.4 -266','(-?\d+\.?\d?)','match'))
ans =
3.0000 5.0000 12.0000 15.4000 -266.0000
从 16b 开始,您可以使用字符串 class
line = "bla bal bli : 3 5 12 15 266";
numbers = extractAfter(line,': ');
numbers = split(numbers);
numbers = double(numbers);
这似乎是最快的选择。
>> profFunc
Elapsed time is 0.088259 seconds.
Elapsed time is 1.558718 seconds.
Elapsed time is 1.482743 seconds.
function profFunc
n = 1E4;
tic;
for i = 1:n
line = "bla bal bli : 3 5 12 15 266";
numbers = extractAfter(line,': ');
numbers = split(numbers);
numbers = double(numbers);
end
toc
tic;
for i = 1:n
line = 'bla bal bli : 3 5 12 15 266';
numbers = str2double(regexp(line,'(?<!\d)(\d)+(?!\d)','match'));
end
toc
tic;
for i = 1:n
line = 'bla bal bli : 3 5 12 15 266';
numstr = strsplit(line,':');
nums = sscanf(numstr{2},'%u');
end
toc
end