我有一个包含字符串和数字的单元格数组。这些字符串包含双引号,这些引号在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()应用于此混合设置中的字符串的帮助!
答案 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
如您所见,数字仍然保留,但每个字符串的引号都会被删除。