Как я могу отформатировать строки для использования в качестве имен структурных полей в MATLAB? - PullRequest
9 голосов
/ 16 ноября 2010

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

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

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

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

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

Какой более эффективный способ сделать это?

Ответы [ 4 ]

10 голосов
/ 16 ноября 2010

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

Как и во многих проблемах в 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'));
6 голосов
/ 16 ноября 2010

Самый простой способ - использовать встроенную функцию genvarname. Это заставит имя выглядеть уродливым, но оно гарантированно будет действительным именем И сохранит оригинальную уникальность.

Если вы просто хотите удалить определенные символы, вы можете использовать regexprep:

regexprep('foo- /foo- /foo', '[- \/]', '')
0 голосов
/ 16 ноября 2010

Вот еще одно решение:

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
0 голосов
/ 16 ноября 2010

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

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

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

например:

function i = isAllowed(str)

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


...

name(~isAllowed(name)) = [];
...