9

我想从字符串中删除连字符 ( -)、斜杠 ( /) 和空格 ( ),以便可以将其用作结构字段名称。name(i)

这是我目前使用该功能的丑陋方式strrep

cell2mat(strrep(strrep(strrep(name(i), '-',''),'/',''),' ', ''))

我还尝试了其他变体,例如:

strrep(name(i),{'-','/'},{'',''});
strrep(name(i),['-','/'],['','']);

有什么更有效的方法来做到这一点?

4

4 回答 4

10

注意:我猜您的变量name是字符串的单元格数组,在这种情况下,您将希望使用{}(即内容索引)而不是()(即单元格索引)从中获取字符串...

与 MATLAB 中的许多问题一样,有许多不同的方法可以解决这个问题......


选项 1:您可以使用函数REGEXPREP。以下删除连字符、正斜杠和空格:

newName = regexprep(name{i},'[-/\s]','');

这里的好处是\s它将匹配和替换所有空白字符,其中包括普通空格(ASCII 代码 32)以及制表符、换行符等。

如果您想安全并删除MATLAB 变量/字段名称中的每个无效字符,您可以将上述简化为:

newName = regexprep(name{i},'\W','');


选项 2:如果您不需要担心删除列出的 3 个字符以外的任何内容,则可以使用ISMEMBER函数,如下所示:

newName = name{i};
newName(ismember(newName,'-/ ')) = [];


选项 3:如果您只想保留所有字母数字字符并转储其余部分(连字符、空格、下划线等),则可以使用函数ISSTRPROP

newName = name{i};
newName = newName(isstrprop(newName,'alphanum'));
于 2010-11-16T18:42:45.733 回答
6

最简单的方法是使用内置函数 genvarname。它会使名称看起来更难看,但它保证是一个有效的名称,它会保留你原来的唯一性。

如果您只想删除特定字符,可以使用 regexprep:

regexprep('foo- /foo- /foo', '[- \/]', '')
于 2010-11-16T18:48:20.493 回答
0

字符串只是数组,因此您可以执行以下操作:

name(name == '-' | name == '/' | name = ' ') = [];

关于您的总体目标,结构名称中还有更多无效的字符。你打赌定义一组允许的字符,并消除不在该组中的所有字符。

例如:

function i = isAllowed(str)

i = (str >= '0' & str <= '9') ...
  | (str >= 'a' & str <= 'z') ...
  | (str >= 'A' & str <= 'Z');


...

name(~isAllowed(name)) = [];
于 2010-11-16T18:44:18.737 回答
0

这是另一个解决方案:

name = 'some/path/file-name ext';    %# sample string
blacklist = {'-' '/' ' '};           %# list of character not allowed

idx = cell2mat( cellfun(@(c)strfind(name,c), blacklist, 'UniformOutput',false) );
name(idx) = '_';                    %# you can remove/replace those locations

>> name
 name =
 some_path_file_name_ext
于 2010-11-16T20:03:51.067 回答