2010-11-16 38 views
9

我想從字符串name(i)中刪除連字符(-),斜槓(/)和空格(),以便我可以將其用作結構字段名稱。如何格式化字符串以用作MATLAB中的結構字段名稱?

這是醜陋的方式我目前做它使用功能strrep

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

我也嘗試過其他的變化,比如:

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

什麼是更有效的方式這樣做?

回答

10

注:我猜你的變量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

一些人,當遇到一個問題,認爲「我知道,我將使用正則表達式。「現在他們有兩個問題。 :)認真 - 呃。 – Marc 2010-11-17 13:55:27

+0

我已經在使用正則表達式,只是想知道什麼是合法字符,所以對我來說沒有新問題... ;-) – sage 2013-08-12 20:13:01

0

字符串本身就是數組,所以你可以這樣做:

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

對於您的總體目標,還有更多的字符不是一個struct名有效。你可以下注定義一組允許的個字符,並且消除所有不屬於該集合的內容。

例如:

function i = isAllowed(str) 

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


... 

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

最簡單的方法是使用內置函數genvarname。它會使名字看起來更醜,但它保證是一個有效的名稱,它會保留你原來的獨特性。

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

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

+1:'genvarname'是解決整體問題的正確方法。然而,正則表達式是解決簡單問題的重量級解決方案。 – 2010-11-16 18:49:03

+0

GENVARNAME很有趣,但它只刪除空格。它用其十六進制表示替換其他字符,這使得可用於結構字段的可怕名稱。 – gnovice 2010-11-16 19:02:15

+1

正如我上面所說,它會使名稱看起來很醜,但它保證你的名字是有效的,並保留你原來的獨特性。如果你想手動替換/刪除字符,你必須小心1)刪除所有無效的字符2)不破壞你的原始唯一性。 – 2010-11-16 22:16:38

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 
相關問題