MATLAB regexprep命令,包含字符串和数字的单元格数组

时间:2014-08-04 22:32:13

标签: arrays string matlab cell-array

我有一个包含字符串和数字的单元格数组。这些字符串包含双引号,这些引号在MATLAB中为我创建了问题。我找到了用this link中的单引号替换双引号的解决方案。但是,当所有单元格内容都是字符串时,解决方案似乎才有效,而且我的某些内容中有数字。我不想将我拥有的数字转换为字符串,因为我将在工作流程中稍后对它们进行计算。

以下是我所拥有的单元格类型的示例以及到目前为止我尝试过的内容:

myCell1 = {'';'"some words"';64;23;'"words"'};
myCell2={'';'more words';'more stuff';46;15};
Cell={myCell1, myCell2}

% Attempt at a for loop to only apply regexprep to strings
for i = 1 : numel(Cell)
    for r = 1:numel(Cell{i})
        if ischar(Cell{i}{r})
            newCell{i}{r} = regexprep(Cell, '^"|"$', '');
        end
    end
end

非常感谢任何有关如何将regexprep()应用于此混合设置中的字符串的帮助!

2 个答案:

答案 0 :(得分:1)

在我看来,你几乎拥有它。我对您的代码进行了一些修改,似乎有效。更改的行是带注释的行。

for i = 1 : numel(Cell)
    for r = 1:numel(Cell{i})
        if ischar(Cell{i}{r})
            newCell{i}{r} = regexprep(Cell{i}{r}, '^"|"$', ''); %// changed "Data" to "Cell"
        else %// added this branch...
            newCell{i}{r} = Cell{i}{r}; %// ... to keep cells containing numbers unchanged
        end
    end
end

答案 1 :(得分:1)

在处理正则表达式时,您没有选择权。如果要将数字用于正则表达式,必须将数字转换为字符串。但是,Luis Mendo的方法更简单,因为您在逻辑分支中只需要另一个if语句。这种方法也很好,而且更简单。

如果您不想这样做并希望在正则表达式中使用数字,我们可以跟踪您的单元格数组中的哪些元素是开头的数字,将这些数字转换为字符串,使用{{1然后,当你完成后,将这些条目转换回数字。

您可以使用cellfun检查单元格数组中的哪些元素是数字。然后,将这些元素转换为字符串,进行处理,然后转换回来。首先检查每个元素是否是isnumeric的数字。在此之后,您可以使用num2str将数字转换为字符串。之后,使用str2num将字符串转换回数字。换句话说,这样做:

regexprep

此时的输出是:

myCell1 = {'';'"some words"';64;23;'"words"'};
myCell2={'';'more words';'more stuff';46;15};
Cell={myCell1, myCell2};
newCellArray = cell(1,numel(Cell)); %// Place output cell array here

for i = 1 : numel(Cell)
    %// Extract i'th cell
    cel = Cell{i};
    %// Which ones are numbers?
    whichAreNumbers = cellfun(@isnumeric, cel);

    %// Convert those numbers into strings
    outStrings = cellfun(@num2str, cel(whichAreNumbers), 'uni', false);
    %// Assign back into cell
    cel(whichAreNumbers) = outStrings;

    %// Apply regexprep now
    newCell = regexprep(cel, '^"|"$', '');

    %// Convert the numbers back
    outVals = cellfun(@str2num, newCell(whichAreNumbers), 'uni', false);
    newCell(whichAreNumbers) = outVals;

    %// Place in master output cell array
    newCellArray{i} = newCell;       
end

如您所见,数字仍然保留,但每个字符串的引号都会被删除。