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