Как я могу отформатировать строки для использования в качестве имен структурных полей в 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)) = [];