2010-11-16 14 views
9

name(i) dizgisinden tire (-), eğik çizgileri (/) ve beyaz boşluk () kaldırmak istiyorum, böylece bir yapı alan adı olarak kullanabilirsiniz.MATLAB'da yapı alanı adları olarak kullanmak için dizeleri nasıl biçimlendirebilirim?

Bu şu anda işlevini strrep kullanarak yapıyorum çirkin yoludur: daha verimli bir yoldur ne

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

: Ben de gibi diğer varyasyonlarını denedi

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

Bunu yapıyor?

cevap

10

Not: ondan dizeleri almak için () yerine {} (yani content indexing) kullanmak isteyeceğiniz bu durumda dizeleri bir hücre dizisi (yani cell indexing) sizin değişken name olduğunu tahmin ediyorum .. .

MATLAB'da pek çok sorunla olduğu gibi, bu çözebilir farklı şekillerde bir dizi ...


Seçenek 1 vardır: sen işlevini kullanabilirsiniz REGEXPREP Aşağıdaki tire, sağa doğru eğik çizgiler ve boşluk kaldırır:

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

burada faydası \s maç ve normal boşluk (ASCII kodu 32) yanı sıra sekmeleri içerir tüm boş karakterleri yerini alacak olmasıdır, yeni satırlar, vb ..

güvende olmak ve kaldırmak istiyorsanız

bir MATLAB variable/field name geçerli olmayan her karakter, bu yukarıdaki kolaylaştırabilirsiniz:

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


Seçenek 2: Eğer listede 3 karakterden daha başka bir şey kaldırma hakkında endişelenmenize gerek yok, bunu böyle işlevini ISMEMBER kullanabilirsiniz:

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


Seçenek 3 : Yalnızca bir alfanümerik karakter olan her şeyi saklamak ve geri kalanları (tire, boşluk, alt çizgi vb.) Bırakmak istiyorsanız, ISSTRPROP:

işlevini kullanabilirsiniz.
+2

Bazı insanlar, bir sorun ile karşı karşıya kaldıklarında, ben, biliyorum" düşünüyorum: Burada

regexprep('foo- /foo- /foo', '[- \/]', '') 
Marc

+0

Zaten regexp kullanıyordum ve sadece yasal karakterlerin ne olduğunu bilmek istedim, bu yüzden benim için yeni bir sorun yok; ;-) – sage

0

dizeleri sadece diziler, bu yüzden böyle bir şey yapabileceğini: genel hedefe ilişkin olarak

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

, bir yapı adına geçerli olmayan daha birçok karakter vardır. izin verilen karakter kümesini tanımlamak ve o setteki olmayan her şeyi ortadan kaldırmakla bahse girersiniz.

örn.:

function i = isAllowed(str) 

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


... 

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

En kolay yol, yerleşik işlev genvarname kullanmaktır. Bu adın çirkin görünmesini sağlayacak, ancak geçerli bir isim olması garantilidir VE size özgün özgünlüğünü koruyacaktır. Sadece belirli karakterleri kaldırmak isterseniz

, sen regexprep kullanabilirsiniz:

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 
+2

+1: 'genvarname' genel sorun için doğru çözümdür. Bununla birlikte, düzenli ifadeler basit bir soruna ağır bir çözümdür. –

+0

GENVARNAME ilginç ancak yalnızca boşlukları kaldırıyor. Diğer karakterleri onaltılık gösterimleriyle değiştirir, bu da bir yapı alanı için kullanılabilecek çirkin bir isim yapar. – gnovice

+1

Yukarıda da belirttiğim gibi, adın çirkin görünmesini sağlar, ancak adınızın geçerli olduğunu garanti eder ve özgün özgünlüğünüzü korur. Eğer chars'ı elle değiştirmek/silmek isterseniz, 1) tüm geçersiz karakterleri kaldırın 2) özgünlüğünüzü yok etmeyin. –

0

başka bir çözüm var 'düzenli ifadeler kullanacağım.' Şimdi onların iki problemi var. :) Cidden -çok.
İlgili konular