我想从字符串-
中删除连字符(/
),斜杠()和空格(
name(i)
),以便我可以将其用作结构字段名称。
这是我目前使用函数strrep
进行的丑陋方式:
cell2mat(strrep(strrep(strrep(name(i), '-',''),'/',''),' ', ''))
我也尝试了其他变体,例如:
strrep(name(i),{'-','/'},{'',''});
strrep(name(i),['-','/'],['','']);
更有效的方法是什么?
答案 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