在MatLab中使用正则表达式进行数字提取

mznpcxlj  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(218)

我想在MatLab中从一个单元格数组中从字符串中提取整数。每个字符串包含1或2个整数,格式如下所示。每个数字可以是一位或两位数。我想将每个字符串转换为1x2数组。如果字符串中只有一个数字,则第二列应为-1。如果有两个数字,则第一个条目应该是第一个数字,第二个条目应该是第二个数字。

'[1, 2]'
'[3]'
'[10, 3]'
'[1, 12]'
'[11, 12]'

非常感谢!
我尝试了几种不同的方法,但都没有奏效。我想我需要使用正则表达式,并且很难找到合适的表达方式。

bnlyeluc

bnlyeluc1#

您可以使用str2num将格式良好的字符(您似乎有)转换为正确的数组/标量。然后简单地从end+1元素填充到值为-1的第二个元素(注意,在已经有两个元素的情况下这不是什么)。
这是在一个小循环中最清楚地完成的,请参阅评论了解详细信息:

% Set up the input
c = { ...
    '[1, 2]'
    '[3]'
    '[10, 3]'
    '[1, 12]'
    '[11, 12]'
    };

n = cell(size(c));          % Initialise output
for ii = 1:numel(n)         % Loop over chars in 'c'
    n{ii} = str2num(c{ii}); % convert char to numeric array
    n{ii}(end+1:2) = -1;    % Extend (if needed) to 2 elements = -1
end

% (Optional) Convert from a cell to an Nx2 array
n = cell2mat(n);

如果您真的想使用正则表达式,可以用类似的代码替换循环部分:

n = regexp( c, '\d{1,2}', 'match' ); % Match between one and two digits
for ii = 1:numel(n)
    n{ii} = str2double(n{ii});       % Convert cellstr of chars to arrays
    n{ii}(end+1:2) = -1;             % Pad to be at least 2 elements
end

但有很多方法可以在不使用正则表达式的情况下完成此操作,例如,您可以使用erase方括号,用逗号分隔,然后根据每行中是否有逗号来填充-1。将其全部 Package 在一个更难阅读(与循环相比)的cellfun中,然后您就会得到一行代码:

n = cellfun( @(x) [str2double( strsplit( erase(x,{'[',']'}), ',' ) ), -1*ones(1,1-nnz(x==','))], c, 'uni', 0 );

为了便于阅读和调试,我建议使用其中的一个循环。

相关问题