如何格式化字符串以用作MATLAB中的结构字段名称?

时间:2010-11-16 18:39:55

标签: string matlab field matlab-struct

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

这是我目前使用函数strrep进行的丑陋方式:

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

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

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

更有效的方法是什么?

4 个答案:

答案 0 :(得分:10)

注意:我猜你的变量name是字符串的单元格数组,在这种情况下你需要使用{}(即content indexing )而不是()(即cell indexing)从中获取字符串...

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


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

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

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

如果您想要安全并删除MATLAB variable/field name中无效的每个字符,您可以将上述内容简化为:

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


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

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


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

newName = name{i};
newName = newName(isstrprop(newName,'alphanum'));

答案 1 :(得分:6)

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

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

regexprep('foo- /foo- /foo', '[- \/]', '')

答案 2 :(得分:0)

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

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

关于您的总体目标,还有更多字符在结构名称中无效。你打算定义一组允许的字符,并删除那些不在该集合中的所有内容。

e.g:

function i = isAllowed(str)

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


...

name(~isAllowed(name)) = [];

答案 3 :(得分: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