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

如果要从字符串中提取整数,可以使用正则表达式:

  1. 获取数字作为字符串元胞数组:

    >> line = 'bla bal bli : 3 5 12 15 266';
    >> regexp(line,'(?<!\d)(\d)+(?!\d)','match')
    ans = 
        '3'    '5'    '12'    '15'    '266'
    
  2. 获取数字作为数值向量:

    >> 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