2010-11-16 29 views
9

Tôi muốn xóa dấu gạch nối (-), dấu gạch chéo (/) và khoảng trắng () từ một chuỗi name(i) để tôi có thể sử dụng nó làm tên trường cấu trúc.Làm cách nào để định dạng chuỗi để sử dụng làm tên trường cấu trúc trong MATLAB?

Đây là cách xấu xí Tôi hiện đang làm việc đó bằng cách sử dụng chức năng strrep:

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

Tôi cũng đã cố gắng biến thể khác, chẳng hạn như:

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

một cách hiệu quả hơn là gì làm điều này?

Trả lời

10

Lưu ý: Tôi đoán biến name của bạn là một mảng di động của chuỗi, trong trường hợp này bạn sẽ muốn sử dụng {} (tức content indexing) thay vì () (tức cell indexing) để có được những chuỗi từ nó .. .

Như với nhiều vấn đề trong MATLAB, có một số cách khác nhau mà bạn có thể giải quyết này ...


Lựa chọn 1: bạn có thể sử dụng chức năng REGEXPREP. Sau đây loại bỏ dấu gạch nối, dấu gạch chéo về phía trước, và khoảng trắng:

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

Lợi ích ở đây là \s sẽ phù hợp và thay thế tất cả ký tự khoảng trắng, trong đó bao gồm một không gian bình thường (mã ASCII 32) cũng như các tab, dòng mới, vv ..

Nếu bạn muốn được an toàn và loại bỏ mỗi nhân vật đó không phải là hợp lệ trong một MATLAB variable/field name, bạn có thể đơn giản hóa việc trên như sau:

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


Phương án 2: Nếu bạn không cần phải lo lắng về việc loại bỏ bất cứ điều gì khác hơn so với 3 ký tự mà bạn liệt kê, bạn có thể sử dụng chức năng ISMEMBER như vậy:

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


Lựa chọn 3 : Nếu bạn muốn giữ mọi thứ là ký tự chữ và số và bỏ phần còn lại (dấu gạch ngang, khoảng trắng, dấu gạch dưới, v.v.), bạn có thể sử dụng hàm ISSTRPROP:

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

Một số người, khi phải đối mặt với một vấn đề, suy nghĩ "Tôi biết, tôi sẽ sử dụng cụm từ thông dụng. " Bây giờ họ có hai vấn đề. :) Nghiêm túc -nice. – Marc

+0

Tôi đã sử dụng regexp và chỉ muốn biết nhân vật hợp pháp là gì, vì vậy không có vấn đề gì mới đối với tôi ... ;-) – sage

0

Strings chỉ là mảng, vì vậy bạn có thể làm một cái gì đó như:

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

Đối với những mục tiêu tổng thể của bạn, có rất nhiều nhân vật mà không phải là hợp lệ trong một tên struct. Bạn đang đặt cược xác định một tập hợp các ký tự cho phép và loại bỏ mọi thứ không có trong tập hợp đó.

ví dụ::

function i = isAllowed(str) 

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


... 

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

Cách dễ nhất là sử dụng chức năng genvarname được tích hợp sẵn. Nó sẽ làm cho tên trông xấu hơn, nhưng nó được bảo đảm là một tên hợp lệ và nó sẽ giữ lại cho bạn tính duy nhất ban đầu.

Nếu bạn chỉ muốn loại bỏ nhân vật cụ thể, bạn có thể sử dụng regexprep:

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

+1: 'genvarname' là giải pháp đúng cho toàn bộ vấn đề. Tuy nhiên, biểu thức chính quy là một giải pháp nặng cho một vấn đề đơn giản. –

+0

GENVARNAME rất thú vị, nhưng nó chỉ loại bỏ các khoảng trắng. Nó thay thế các ký tự khác bằng cách biểu diễn hex của chúng, làm cho một tên ẩn để sử dụng cho một trường cấu trúc. – gnovice

+1

Như tôi đã nói ở trên, nó sẽ làm cho tên trông xấu xí, nhưng nó đảm bảo tên của bạn là hợp lệ và giữ lại tính độc đáo ban đầu của bạn. Nếu bạn muốn thay thế/xóa ký tự theo cách thủ công, bạn phải cẩn thận với 1) xóa tất cả các ký tự không hợp lệ 2) không phá hủy tính độc đáo ban đầu của bạn. –

0

Đây là một giải pháp:

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 
Các vấn đề liên quan