代码之家  ›  专栏  ›  技术社区  ›  Elpezmuerto

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

  •  9
  • Elpezmuerto  · 技术社区  · 15 年前

    我要删除连字符( - ),斜线( / )和空白( )从一串 name(i) 所以我可以用它作为结构字段名。

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

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

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

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

    做这件事的更有效的方法是什么?

    4 回复  |  直到 8 年前
        1
  •  10
  •   gnovice    15 年前

    注: 我猜你的变量 name 是字符串的单元格数组,在这种情况下您将要使用 {} (即。 content indexing )而不是 () (即。 cell indexing )为了从中得到线索。。。

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


    选项1: 你可以用这个函数 REGEXPREP . 以下命令将删除连字符、正斜杠和空白:

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

    这样做的好处是 \s 将匹配并替换 全部的 空白字符,包括普通空格(ASCII代码32)以及制表符、换行符等。。

    如果你想安全并移除 每一个 在中无效的字符 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'));
    
        2
  •  6
  •   Rich C    15 年前

    最简单的方法是使用内置函数genvarname。它会使名字看起来更难看,但它保证是一个有效的名字,它将保留你原来的唯一性。

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

    regexprep('foo- /foo- /foo', '[- \/]', '')
    
        3
  •  0
  •   Oliver Charlesworth    15 年前

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

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

    就您的总体目标而言,还有许多字符在结构名称中无效。你肯定会定义一组 允许的 字符,并删除不在该集合中的所有字符。

    例如。:

    function i = isAllowed(str)
    
    i = (str >= '0' & str <= '9') ...
      | (str >= 'a' & str <= 'z') ...
      | (str >= 'A' & str <= 'Z');
    
    
    ...
    
    name(~isAllowed(name)) = [];
    
        4
  •  0
  •   Amro    15 年前

    下面是另一个解决方案:

    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