String 如何设置字符串格式以用作MATLAB中的结构字段名?

String 如何设置字符串格式以用作MATLAB中的结构字段名?,string,matlab,field,matlab-struct,String,Matlab,Field,Matlab Struct,我想从字符串名称(I)中删除连字符(-)、斜杠(/)和空格(),以便将其用作结构字段名 这是我目前使用函数进行操作的丑陋方式: 我还尝试了其他变体,例如: strrep(name(i),{'-','/'},{'',''}); strrep(name(i),['-','/'],['','']); 什么是更有效的方法?注意:我猜您的变量name是一个字符串单元格数组,在这种情况下,您将希望使用{}(即)而不是()(即)从中获取字符串 与MATLAB中的许多问题一样,有许多不同的方法可以解决这个问题

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

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

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

strrep(name(i),{'-','/'},{'',''});
strrep(name(i),['-','/'],['','']);
什么是更有效的方法?

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

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


选项1:您可以使用该功能。以下操作将删除连字符、正斜杠和空格:

newName = regexprep(name{i},'[-/\s]','');
这里的好处是
\s
将匹配并替换所有空白字符,其中包括普通空格(ASCII代码32)以及制表符、换行符等

如果希望安全并删除中的所有无效字符,可以将上述操作简化为:

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

选项2:如果您不需要担心删除除列出的3个字符以外的任何字符,您可以使用如下功能:


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


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

name(name == '-' | name == '/' | name = ' ') = [];
就您的总体目标而言,还有更多的字符在结构名称中无效。您可以打赌定义一组允许的字符,并删除不在该集合中的所有字符

e、 g:

函数i=isAllowed(str)

i=(str>='0'&str='a'&str='a'&str最简单的方法是使用内置函数genvarname。它会使名称看起来更难看,但它保证是一个有效的名称,并且会保留原始的唯一性

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

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

下面是另一个解决方案:

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

+1:
genvarname
是解决整个问题的正确方法。然而,正则表达式是解决一个简单问题的重量级解决方案。genvarname很有趣,但它只删除空格。它用十六进制表示替换其他字符,这使得结构字段使用了一个可怕的名称。正如我所说的above,它会使名称看起来很难看,但它保证您的名称有效并保留原始唯一性。如果您想手动替换/删除字符,则必须小心1)删除所有无效字符2)不要破坏原始唯一性。挂:不破坏唯一性这一点很好,虽然如果连字符、斜杠等是唯一使字符串唯一的东西,这会有点奇怪。有些人在遇到问题时会认为“我知道,我会使用正则表达式。”现在他们有两个问题:说真的-很好。我已经在使用regexp了,只是想知道什么是合法字符,所以对我来说没有新问题…;-)
name(name == '-' | name == '/' | name = ' ') = [];
function i = isAllowed(str)

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


...

name(~isAllowed(name)) = [];
regexprep('foo- /foo- /foo', '[- \/]', '')
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