Как я могу отформатировать строки для использования в качестве имен структурных полей в MATLAB?

Хочу удалить дефисы (-), косая черта (/) и пробел () из строки name(i) так что я могу использовать его в качестве имени поля структуры.

Это ужасный способ, которым я сейчас занимаюсь, используя функцию strrep:

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

Я также пробовал другие варианты, такие как:

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

Что является более эффективным способом сделать это?

4 ответа

Решение

Примечание: я угадываю вашу переменную name это массив ячеек строк, в этом случае вы захотите использовать {} (т.е. индексацияконтента) вместо () (т.е. индексацияячейки), чтобы получить строки из него...

Как и в случае со многими проблемами в MATLAB, существует множество способов решить эту проблему...


Вариант 1: Вы можете использовать функцию REGEXPREP. Следующее удаляет дефисы, косые черты и пробелы:

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

Преимущество здесь в том, что \s будет сопоставлять и заменять все пробельные символы, включая обычный пробел (код ASCII 32), а также символы табуляции, перевода строки и т. д.

Если вы хотите быть в безопасности и удалить все символы, которые недопустимы в имени переменной / поля MATLAB, вы можете упростить приведенное выше:

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


Вариант 2. Если вам не нужно беспокоиться об удалении чего-либо, кроме трех символов, которые вы перечислили, вы можете использовать функцию ISMEMBER следующим образом:

newName = name{i};
newName(ismember(newName,'-/ ')) = [];


Вариант 3: Если вы хотите просто сохранить все, что является буквенно-цифровым символом, и сбросить все остальное (дефисы, пробелы, подчеркивания и т. Д.), Вы можете использовать функцию ISSTRPROP:

newName = name{i};
newName = newName(isstrprop(newName,'alphanum'));

Самый простой способ - использовать встроенную функцию 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

Строки - это просто массивы, так что вы можете сделать что-то вроде:

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

Что касается вашей общей цели, есть еще много символов, которые недопустимы в имени структуры. Вы ставите ставку на определение набора допустимых символов и удаление всего, что не входит в этот набор.

например:

function i = isAllowed(str)

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


...

name(~isAllowed(name)) = [];
Другие вопросы по тегам