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

9

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

目前,我使用函数strrep来实现这个功能,但这种方式比较繁琐。

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

我还尝试了其他变化,比如:

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

什么是更有效的方法来做这件事?
4个回答

10
< p > < em > 注意:我猜测您的变量< code > name 是一个字符串的单元数组,在这种情况下,您将需要使用< code > {} (即< em > content 索引)而不是< code >() (即< em > cell 索引)来从中获取字符串...

与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'));

2
有些人在面对问题时,会想:“我知道了,我来用正则表达式解决。”现在他们有两个问题了。:) 说真的,很好笑。 - Marc
我已经在使用正则表达式,只是想知道哪些是合法字符,所以对我来说没有新问题...;-) - sage

6

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

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

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

2
+1: genvarname 是解决整个问题的正确方法。然而,正则表达式是一个简单问题的重量级解决方案。 - Oliver Charlesworth
GENVARNAME很有趣,但它只是去掉空格。它用十六进制表示替换其他字符,这使得在结构字段中使用的名称非常丑陋。 - gnovice
1
正如我之前所说,这样会使名称看起来不太美观,但它可以确保您的名称是有效的并保留您的独特性。如果您想要手动替换/删除字符,必须小心注意:1)删除所有无效字符;2)不能破坏您的原始独特性。 - Rich C
“不破坏唯一性”这一点是非常好的,虽然如果连字符、斜杠等是使字符串唯一的唯一因素会有些奇怪。 - gnovice

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)) = [];

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接